Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Проблема взаимодействия потоков? Или что-то ещё..? Добавлено: 09.11.07 17:35  

Автор вопроса:  Морячок | ICQ: 115534934 
Здравствуйте, люди!
Наверняка кто-то сталкивался с проблемами, подобными моим, помогите, пожалуйста!

Итак. На форме имеется объект, который работает с последовательным портом, используя стандартный объект Фреймворка SerialPort.
В этой же форме, я поднимаю HttpWebRequest, чтобы в виде URL отправить данные на сервер в интернете.
Проблема в том, что когда я подключён к порту, при попытке выполнить HttpWebRequest.GetResponse происходит Unhandled исключение. Смутно понимаю, что имею проблемы работы с потоками.
Как их обойти? Кто-нибудь может показать простой пример, на котором я могу увидеть, как сделать это правильно?
Голова дымится неделю. Укажите, пожалуйста, направление, куда копать.

Ответить

  Ответы Всего ответов: 13  

Номер ответа: 1
Автор ответа:
 Морячок



ICQ: 115534934 

Вопросов: 4
Ответов: 17
 Профиль | | #1 Добавлено: 09.11.07 17:43
Напишу поподробнее ,что это такое и для чего это надо. Я разрабатываю библиотеку для работы с GPS-устройствами по протоколу NMEA. Читаю данные с GPS и собираюсь отослать их на сайт, данные передаются в строке url (web-сервис полноценный поднять не получается, так сделано на сайте). Библиотека получается вроде бы неплохая, во всяком случае, лучше, чем те примеры, которые я находил в интернете. Тема интересная, и вроде бы, нужная. Тематика мониторинга местоположения нынче популярна как никогда. Как доделаю, исходники опубликую, может какие-то белые пятна постирает :-)
Но блин, эти потоки........

Ответить

Номер ответа: 2
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #2 Добавлено: 10.11.07 03:45
:\ А почему ты думаешь что это именно потоки?

Ответить

Номер ответа: 3
Автор ответа:
 Морячок



ICQ: 115534934 

Вопросов: 4
Ответов: 17
 Профиль | | #3 Добавлено: 10.11.07 22:00
Я так решил, потому что получал подобные исключения, когда при работе с портом пытался обращаться к пользовательскому интерфейсу. Тогда проблема решилась использованием асинхронных делегатов.
А что ещё может быть, как думаешь?

Исключение возникает, когда имеется подключение к порту. Стоит отключиться от порта - запросы в интернет проходят корректно.

Ответить

Номер ответа: 4
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #4 Добавлено: 11.11.07 17:45
Создай две отдельные проги, одна пусть в инет лезит, другая через порт к железке. Если они одновременно будут корретно работать - проблема наверное действительно с общим АП.

Ответить

Номер ответа: 5
Автор ответа:
 Морячок



ICQ: 115534934 

Вопросов: 4
Ответов: 17
 Профиль | | #5 Добавлено: 11.11.07 23:27
Да, завтра попробую, отпишусь о результате.

Ответить

Номер ответа: 6
Автор ответа:
 Морячок



ICQ: 115534934 

Вопросов: 4
Ответов: 17
 Профиль | | #6 Добавлено: 12.11.07 12:10
Создал два экземпляра программы.
Один - работает с железкой, второй в это время без проблем лазит в .

Если же пытаться в рамках одного и того же экземпляра и работать с портом, и выходить в интернет - получаю исключение.

Как лечить?

Ответить

Номер ответа: 7
Автор ответа:
 Морячок



ICQ: 115534934 

Вопросов: 4
Ответов: 17
 Профиль | | #7 Добавлено: 12.11.07 12:11
Создал два экземпляра программы.
Один - работает с железкой, второй в это время без проблем лазит в интернет.

Если же пытаться в рамках одного и того же экземпляра и работать с портом, и выходить в интернет - получаю исключение.

Как лечить?

Ответить

Номер ответа: 8
Автор ответа:
 BUMM ®



Вопросов: 8
Ответов: 482
 Профиль | | #8 Добавлено: 18.11.07 00:48
Ну делегаты создавал ведь? молодец. А теперь создавай потоки. Из потоков обращайся к главном процессу через Invoke. Какие проблемы то?

Ответить

Номер ответа: 9
Автор ответа:
 Морячок



ICQ: 115534934 

Вопросов: 4
Ответов: 17
 Профиль | | #9 Добавлено: 23.11.07 14:54
Слушаю порт в одном потоке. В интернет хожу - в другом. Процессы друг с другом никак не взаимодействуют - для тестовых целей данные из потока в поток не передаю, в интернет шлю одну и ту же строку. И всё равно, поработав пару минут получаю WebException. Порознь всё работает нормально. Вот в чём проблема.

Ответить

Номер ответа: 10
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #10 Добавлено: 24.11.07 14:27
WebException - не похоже чтоб имел отношение к потокам.

Какое хоть описание у исключения? А то телепаты в отпуске

Ответить

Номер ответа: 11
Автор ответа:
 Морячок



ICQ: 115534934 

Вопросов: 4
Ответов: 17
 Профиль | | #11 Добавлено: 24.11.07 14:51
Описания исключения нет, пишет, что WEB-exception was unhandled, невозможно найти сборку, содержащую описание ошибки.
Когда чтение из порта, и обращение в интернет происходили в одном потоке, вылет происходил сразу. Теперь, когда я поместил каждый процесс в свой поток, всё нормально работает какое-то время, и всё равно, происходит исключение. Обрабатываю его через Try...Catch. Но само то, что оно возникает-значит что я что-то делаю не так...

Ответить

Номер ответа: 12
Автор ответа:
 Морячок



ICQ: 115534934 

Вопросов: 4
Ответов: 17
 Профиль | | #12 Добавлено: 03.12.07 16:44
Вот, набросал очень упрощённый пример...
Форма, на ней лежит кнопка Button1. Форма содержит следующий код:

Imports System
Imports System.Net
Imports System.IO.Ports

Public Class Form1

    Private Function Open_Serial_Port() As SerialPort
        Try
            Dim ThePort As SerialPort = New SerialPort("COM4", 4800, Parity.None, 8, StopBits.One)
            With ThePort
                .NewLine = vbCrLf
                .ReadTimeout = 2500
                .WriteTimeout = 2500
                .ReadBufferSize = 4096
                .WriteBufferSize = 4096
                .DataBits = 8
            End With
            ThePort.Open()
            Return ThePort
        Catch ex As Exception
            Debug.WriteLine(ex.Message)
            Return Nothing
        End Try
    End Function

    Private Sub WriteIt(ByVal URL As String)
        Dim ex As Exception
        Dim myReq As HttpWebRequest = CType(WebRequest.Create(URL), HttpWebRequest)
        '*****
        'если подключены к интернету не через прокси, то эту часть можно закомментарить
        Dim myProxy As New WebProxy
        Dim newUri As New Uri("http://PROXY:80";)
        myProxy.Address = newUri
        myProxy.Credentials = System.Net.CredentialCache.DefaultCredentials
        myReq.Proxy = myProxy
        '*****
        myReq.Credentials = System.Net.CredentialCache.DefaultCredentials
        Try
            Dim myResponce As HttpWebResponse = myReq.GetResponse
            myResponce.Close()
            Debug.WriteLine(URL & " " & Now.ToString)
        Catch ex
            MsgBox(ex.Message)
        End Try
    End Sub

    Public Sub DoWork()
        Dim mySerialPort As SerialPort
        Dim myString As String
        'открываем порт
        mySerialPort = Open_Serial_Port()
        Do
            'читаем из порта
            myString = mySerialPort.ReadExisting
            'запрос в интернет
            WriteIt("http://www.ya.ru";)
            Threading.Thread.Sleep(2000)
        Loop
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ;DoWork()
    End Sub
End Class


Запустив проект, нажимаем кнопку. Происходит подключение к последовательному порту. И после этого, пытаемся зайти в интернет. Какое-то время всё работает нормально, но потом возникает исключение

A first chance exception of type 'System.SystemException' occurred in mscorlib.dll
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
A first chance exception of type 'System.SystemException' occurred in mscorlib.dll
A first chance exception of type 'System.Net.WebException' occurred in System.dll


После этого при обращении к интернету данное исключение возникает постоянно. Требуется перезапуск проекта. Пробовал просто закомментарить кусок кода, в котором читаем из порта. В этом случае замечательно работаем целый день и никаких исключений не происходит. Равно как и при чтении из порта - всё нормально.
А вот при обращении к нету после чтения из порта - происходят непонятности....
Пробовал запускать без прокси - всё равно.

Ответить

Номер ответа: 13
Автор ответа:
 Морячок



ICQ: 115534934 

Вопросов: 4
Ответов: 17
 Профиль | | #13 Добавлено: 07.12.07 19:49
У веб-исключения статус: ConnectFailed.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам