7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
|
|||||||||||
1 | |||||||||||
Как вынести работу с SerialPort в отдельный поток?03.04.2017, 17:27. Показов 4060. Ответов 12
Метки нет (Все метки)
Подскажите как правильно работать с потоками?
Работаю с Serial Com Port, снимаю с него текстовые данные, как цикл выкинуть в отдельный поток? Как сделать чтобы другие кнопки формы не повисали? Форма не висла?
Выкинул вот так, нет данных в Textbox1 или не работает!
0
|
03.04.2017, 17:27 | |
Ответы с готовыми решениями:
12
Как вынести обработчик глобального хука в отдельный поток? Вынести работу с интернетом в отдельный поток Как вынести подключение к БД в отдельный поток? Как вынести код в отдельный поток? |
Модератор
4314 / 3388 / 507
Регистрация: 27.01.2014
Сообщений: 6,186
|
|
03.04.2017, 17:28 | 2 |
у SerialPort есть событие DataArrived вроде. Обрабатывайте в нем полученные данные, ничего виснуть не будет и ненужно доп. потоки городить...
0
|
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
|
|
03.04.2017, 17:33 [ТС] | 3 |
Yury Komar, спасибо, проверю...
Ну а вообще как с потоками быть, не только здесь это мне понадобилось... В моем примере как реализовать через Thread..., чтобы я знал на будущее?!
0
|
03.04.2017, 18:46 | 4 |
DataReceived . Неудобное событие. Возникает не когда все данные приняты, а где попало.ReadLine ждёт определённого символа. Надо чтобы в протоколе обмена он был завершающим. Из потока нельзя обращаться к GUI. DoEvents - костыль, выкручивайтесь без него. Тем более он тут не нужен.Читайте литературу по теме. Раз выбрали VB .Net, ищите хорошие книги, где и потоки разбираются.
0
|
Модератор
4314 / 3388 / 507
Регистрация: 27.01.2014
Сообщений: 6,186
|
|
04.04.2017, 05:20 | 5 |
Добавлено через 8 минут кстати вот все тоже самое, что сказал Rius. Там и говорится что, при использовании потоков, для обращения к UI элементам, нужно использовать Invoke и делегаты... там кстати и пример есть про DataReceived https://msdn.microsoft.com/ru-... .110).aspx
0
|
04.04.2017, 06:04 | 6 |
Как я уже говорил, эта схема в общем случае не работает.
SerialPort.Read гораздо пресказумее, но и у него есть недостатки. https://www.cyberforum.ru/blog... g4357.htmlСейчас допиливаю нативную C++ dll-ку с древними, но удобными методами WinAPI.
0
|
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
|
|
04.04.2017, 10:54 [ТС] | 7 |
Yury Komar, спасибо за ссылку, там пример консольного приложения...
У меня не первый случай необходимости создания потока, с него получить данные и отобразить их в главной форме программы, сколько примеров не находил так и не разобрался.( Я так понимаю: 1. Form - это уже Class; 2. Если я выкидываю функцию или что иное в процесс, то эта функция должна быть в другом Class-e; 3. Для того чтобы с потока получить данные в Form мне нужно использовать Invoke и Delegate; Может кто разжевать?!
0
|
04.04.2017, 12:15 | 8 |
1. Да.
2. Не обязательно. 3. Не обязательно, есть иные способы разной степени (±) костыльности. Литература по C# для начинающих и не только, Шилдт, 23-24 главы.
0
|
Модератор
4314 / 3388 / 507
Регистрация: 27.01.2014
Сообщений: 6,186
|
|||||||||||
04.04.2017, 14:39 | 9 | ||||||||||
самый простой способ, но не всегда помогает при запуске функции в потоке, которая пытается обратиться к элементам управления на форме
Подробнее можно почитать в Википедии. А на пальцах можно легко это показать: Мы будем использовать делегат в качестве проводника между потоками и элементами управления формы, т.к по умолчанию к элементам управления можно получить доступ из того потока, в котором они были созданы, даже если проверка на "CheckForIllegalCrossThreadCalls" отключена, то иногда нельзя обратиться к контролам формы без помощи этих самых делегатов. Поэтому покажу пример использования делегата(как приложение к нашей функции), который обеспечит другому потоку доступ к заголовку формы:
1
|
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
|
||||||
07.04.2017, 20:44 [ТС] | 10 | |||||
Rius, Yury Komar, Rius, получилось, все работает как надо..., но...
В потоке в бесконечном цикле идет принятие информации с COM5 порта, пока он открыт. Принудительно завершаю поток - через 1 - 2 секунды программы вываливается в "The application is in break mode". Как решить?
0
|
7 / 5 / 0
Регистрация: 15.05.2015
Сообщений: 350
|
||||||
07.04.2017, 21:20 [ТС] | 12 | |||||
Rius, как? Добавлено через 8 минут Rius, в общем решил так: 1. Создал переменную типа Boolean = False; 2. Кнопка Стоп меняет ее состояние на = True; 3. Цикл в потоке сначала проверяет значение переменной, потом читает COM порт. Если значение переменной True - выходит из цикла. Так вроде работает без ошибки...
1
|
Модератор
4314 / 3388 / 507
Регистрация: 27.01.2014
Сообщений: 6,186
|
|
08.04.2017, 18:31 | 13 |
правильно, нужно дать потоку дойти самому до конца своего кода, после чего он сам себя закроет, избегая тех ошибок, с которыми вы столкнулись выше...
2
|
08.04.2017, 18:31 | |
08.04.2017, 18:31 | |
Помогаю со студенческими работами здесь
13
Как вынести скачивание файлов в отдельный поток? Вынести соединение с БД в отдельный поток Вынести процедуру в отдельный поток Вынести загрузку и парсинг в отдельный поток Вынести часть работы приложения в отдельный поток Вынести работу с сокетами в отдельный класс Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |