PCCar.ru - Ваш автомобильный компьютер

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Разработка программ

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2013, 14:33   #1
e-statik
Старший Пользователь
 
Регистрация: 07.05.2010
Возраст: 45
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
e-statik is on a distinguished road
По умолчанию Нужна небольшая помощь с кодом (.NET, Win) - не могу сообразить

Пишу обработчик 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
e-statik вне форума   Ответить с цитированием
Старый 25.07.2013, 14:38   #2
e-statik
Старший Пользователь
 
Регистрация: 07.05.2010
Возраст: 45
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
e-statik is on a distinguished road
По умолчанию

Сейчас добрался до того, что на десктопе конкретно запинается на
byte[] bytes = listener.Receive(ref groupEP);

Т.е. фактически ничего по порту не проходит, он ждёт. В принципе, всё правильно. Но как его корректно снаружи пнуть, чтобы он перестал слушать - не могу сообразить.

Пытался дёрнуть что-то вроде
listener.Client.Disconnect
или
listener.Client.Shutdown
получаю ошибки, что-то не то делаю...
__________________
White Octavia RS FL DSG
e-statik вне форума   Ответить с цитированием
Старый 25.07.2013, 23:38   #3
e-statik
Старший Пользователь
 
Регистрация: 07.05.2010
Возраст: 45
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
e-statik is on a distinguished road
По умолчанию

Программистов нет совсем? (((
__________________
White Octavia RS FL DSG
e-statik вне форума   Ответить с цитированием
Старый 26.07.2013, 12:31   #4
Илия
Старший Пользователь
 
Регистрация: 15.05.2011
Возраст: 41
Город: Харьков
Регион: Украина
Машина: Chevy Aveo LS 2006
Сообщений: 420
Илия will become famous soon enough
По умолчанию

Цитата:
Сообщение от e-statik Посмотреть сообщение
Помогите пож! Конкретно хочу мочь ставить чтение на паузу, а так же мочь вообще корректно выключить прослушивание порта и корректно завершить поток.
http://msdn.microsoft.com/en-us/library/tttdef8x.aspx
Пишут:

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
Илия вне форума   Ответить с цитированием
Старый 26.07.2013, 12:49   #5
e-statik
Старший Пользователь
 
Регистрация: 07.05.2010
Возраст: 45
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
e-statik is on a distinguished road
По умолчанию

Наверное, можно было бы тогда вообще вызывать Thread.Abort.
И создавать новый, когда снова надо слушать порт.

Но я попробовал - вызывал Thread.Abort, а потом заново попытался создать. Эксепшн: ругается на уже открытое соединение по этому порту. Явно зависает на listener.Receive.
Где-то проскакивало, что лучше использовать не устаревший Receive, а BeginReceive и EndReceive (или как-то так).
__________________
White Octavia RS FL DSG
e-statik вне форума   Ответить с цитированием
Старый 26.07.2013, 12:51   #6
e-statik
Старший Пользователь
 
Регистрация: 07.05.2010
Возраст: 45
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
e-statik is on a distinguished road
По умолчанию

Короче, похоже, что разбираться нужно скорее не с потоками, а с UdpClient и правильной работой с ним. Так, видимо...
Ну или всё же надо как-то корректно вырубить поток, чтобы он сам отключил соединения и всё остальное, что успел запустить инстанс UdpClient. И тупой Thread.Abort этого явно не делает.
__________________
White Octavia RS FL DSG
e-statik вне форума   Ответить с цитированием
Старый 26.07.2013, 12:52   #7
Илия
Старший Пользователь
 
Регистрация: 15.05.2011
Возраст: 41
Город: Харьков
Регион: Украина
Машина: Chevy Aveo LS 2006
Сообщений: 420
Илия will become famous soon enough
По умолчанию

закрывай слушателя и чисти ресурсы. Сначала 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
Илия вне форума   Ответить с цитированием
Старый 26.07.2013, 12:54   #8
Илия
Старший Пользователь
 
Регистрация: 15.05.2011
Возраст: 41
Город: Харьков
Регион: Украина
Машина: Chevy Aveo LS 2006
Сообщений: 420
Илия will become famous soon enough
По умолчанию

Цитата:
Сообщение от e-statik Посмотреть сообщение
надо как-то корректно вырубить поток, чтобы он сам отключил соединения и всё остальное
Он этого делать за тебя не будет!
__________________
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
Илия вне форума   Ответить с цитированием
Старый 26.07.2013, 12:57   #9
e-statik
Старший Пользователь
 
Регистрация: 07.05.2010
Возраст: 45
Город: Москва
Регион: 77, 97, 99, 177
Машина: Skoda Octavia RS FL 2010
Сообщений: 318
e-statik is on a distinguished road
По умолчанию

О... заработало что ли

Сделал так:
MainWorker.RequestStop();
MainThread.Abort();

а в RequestStop:
listener.Client.Close();
listener.Client.Dispose();
_shouldStop = true;

И стало нормально запускаться и глушиться.

Спасибо!
__________________
White Octavia RS FL DSG
e-statik вне форума   Ответить с цитированием
Старый 26.07.2013, 13:02   #10
Илия
Старший Пользователь
 
Регистрация: 15.05.2011
Возраст: 41
Город: Харьков
Регион: Украина
Машина: Chevy Aveo LS 2006
Сообщений: 420
Илия will become famous soon enough
По умолчанию

Рад помочь!
__________________
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)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 23:46.


Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot