![]() |
![]() |
#1 |
Старший Пользователь
![]() Регистрация: 07.05.2010
Возраст: 46
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
![]() |
![]() Пишу обработчик CAN шины под винду, в Visual Studio, C#.
Раньше под винду и потоки не писал ничего, пытаюсь разобраться, было много опыта только с ASP.NET, сижу буксую... ( Цель - слушать порт 64888. Для этого худо бедно осилил запуск потока и чтение в нем сообщений через UdpClient - данные получаю и обрабатываю. Но не могу правильно тормознуть чтение, поставить на паузу. Либо целиком выключить созданный поток и соединение в нём. Пересмотрел много код снипетов, но пока что-то не заработало, делаю явно неправильно. Помогите пож! Конкретно хочу мочь ставить чтение на паузу, а так же мочь вообще корректно выключить прослушивание порта и корректно завершить поток. Ниже код, который удалось наваять. Код в форме: Код:
// Это срабатывает, когда в радиобатоне выбирается "Слушать/не слушать" if (thisRadioButton.Checked) // Начать прослушивание { MainWorker = new UdpWorker(); MainWorker.handlerMessageReceived = ReceiverMessage; // привязал метод, кот. будет дергаться в форме на каждом сообщении MainThreadDelegate = new ThreadStart(MainWorker.DoWork); MainThread = new Thread(MainThreadDelegate); MainThread.Start(); } else // Остановить прослушивание { MainWorker.RequestStop(); } Код собственно чтения - полуфабрикат, ищу правильное решение: Код:
public class UdpWorker { private const int listenPort = 64888; private UdpClient listener; private volatile bool _shouldStop; public delegate void MessageReceived(CanRxMsg msg); public MessageReceived handlerMessageReceived; public void DoWork() { listener = new UdpClient(listenPort); IPEndPoint groupEP = new IPEndPoint(IPAddress.Loopback, listenPort); try { while (!_shouldStop) { byte[] bytes = listener.Receive(ref groupEP); if (bytes == null || bytes.Length == 0) break; dataHandler(bytes); // Этот метод уже выдаст сообщение наружу, его код не привожу, к проблеме мало относится } } catch (ThreadAbortException) { } finally { //listener.Client.Disconnect(false); //listener.Client.Shutdown(SocketShutdown.Both); //listener.Client.Dispose(); //listener.Close(); } } public void RequestStop() { listener.Client.Shutdown(SocketShutdown.Receive); listener.Client.Close(); _shouldStop = true; } }
__________________
White Octavia RS FL DSG |
![]() |
![]() |
![]() |
#2 |
Старший Пользователь
![]() Регистрация: 07.05.2010
Возраст: 46
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
![]() |
![]() Сейчас добрался до того, что на десктопе конкретно запинается на
byte[] bytes = listener.Receive(ref groupEP); Т.е. фактически ничего по порту не проходит, он ждёт. В принципе, всё правильно. Но как его корректно снаружи пнуть, чтобы он перестал слушать - не могу сообразить. Пытался дёрнуть что-то вроде listener.Client.Disconnect или listener.Client.Shutdown получаю ошибки, что-то не то делаю...
__________________
White Octavia RS FL DSG |
![]() |
![]() |
![]() |
#3 |
Старший Пользователь
![]() Регистрация: 07.05.2010
Возраст: 46
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
![]() |
![]() Программистов нет совсем? (((
__________________
White Octavia RS FL DSG |
![]() |
![]() |
![]() |
#4 | |
Старший Пользователь
![]() Регистрация: 15.05.2011
Возраст: 42
Город: Харьков
Регион: Украина
Машина: Chevy Aveo LS 2006
Сообщений: 420
![]() |
![]() Цитата:
Пишут: Calling Thread.Sleep with Timeout.Infinite causes a thread to sleep until it is interrupted by another thread that calls Thread.Interrupt, or until it is terminated by Thread.Abort.
__________________
Intell D525MW, 4GB, 16GB 1.8 SATA2 SSD, M2-ITX Origin, BU-353, BlueTooth, Lilliput 669GL 7", ADS Tech USB FM, H.264 hard DVR front+back, Win 7 Embedded, Cenrafuce 3.1 Мой CarPc |
|
![]() |
![]() |
![]() |
#5 |
Старший Пользователь
![]() Регистрация: 07.05.2010
Возраст: 46
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
![]() |
![]() Наверное, можно было бы тогда вообще вызывать Thread.Abort.
И создавать новый, когда снова надо слушать порт. Но я попробовал - вызывал Thread.Abort, а потом заново попытался создать. Эксепшн: ругается на уже открытое соединение по этому порту. Явно зависает на listener.Receive. Где-то проскакивало, что лучше использовать не устаревший Receive, а BeginReceive и EndReceive (или как-то так).
__________________
White Octavia RS FL DSG |
![]() |
![]() |
![]() |
#6 |
Старший Пользователь
![]() Регистрация: 07.05.2010
Возраст: 46
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
![]() |
![]() Короче, похоже, что разбираться нужно скорее не с потоками, а с UdpClient и правильной работой с ним. Так, видимо...
Ну или всё же надо как-то корректно вырубить поток, чтобы он сам отключил соединения и всё остальное, что успел запустить инстанс UdpClient. И тупой Thread.Abort этого явно не делает.
__________________
White Octavia RS FL DSG |
![]() |
![]() |
![]() |
#7 |
Старший Пользователь
![]() Регистрация: 15.05.2011
Возраст: 42
Город: Харьков
Регион: Украина
Машина: Chevy Aveo LS 2006
Сообщений: 420
![]() |
![]() закрывай слушателя и чисти ресурсы. Сначала Close потом Dispose.
__________________
Intell D525MW, 4GB, 16GB 1.8 SATA2 SSD, M2-ITX Origin, BU-353, BlueTooth, Lilliput 669GL 7", ADS Tech USB FM, H.264 hard DVR front+back, Win 7 Embedded, Cenrafuce 3.1 Мой CarPc |
![]() |
![]() |
![]() |
#8 | |
Старший Пользователь
![]() Регистрация: 15.05.2011
Возраст: 42
Город: Харьков
Регион: Украина
Машина: Chevy Aveo LS 2006
Сообщений: 420
![]() |
![]() Цитата:
![]()
__________________
Intell D525MW, 4GB, 16GB 1.8 SATA2 SSD, M2-ITX Origin, BU-353, BlueTooth, Lilliput 669GL 7", ADS Tech USB FM, H.264 hard DVR front+back, Win 7 Embedded, Cenrafuce 3.1 Мой CarPc |
|
![]() |
![]() |
![]() |
#9 |
Старший Пользователь
![]() Регистрация: 07.05.2010
Возраст: 46
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
![]() |
![]() О... заработало что ли
Сделал так: MainWorker.RequestStop(); MainThread.Abort(); а в RequestStop: listener.Client.Close(); listener.Client.Dispose(); _shouldStop = true; И стало нормально запускаться и глушиться. Спасибо!
__________________
White Octavia RS FL DSG |
![]() |
![]() |
![]() |
#10 |
Старший Пользователь
![]() Регистрация: 15.05.2011
Возраст: 42
Город: Харьков
Регион: Украина
Машина: Chevy Aveo LS 2006
Сообщений: 420
![]() |
![]() Рад помочь!
__________________
Intell D525MW, 4GB, 16GB 1.8 SATA2 SSD, M2-ITX Origin, BU-353, BlueTooth, Lilliput 669GL 7", ADS Tech USB FM, H.264 hard DVR front+back, Win 7 Embedded, Cenrafuce 3.1 Мой CarPc |
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|