Страница: 1 |
Страница: 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
 oWork()
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.