|
0 / 0 / 0
Регистрация: 05.04.2017
Сообщений: 14
|
||||||
Чтение данных из COM порта без тормозов на форме10.11.2017, 12:14. Показов 4939. Ответов 28
Метки нет (Все метки)
Здравствуйте. Не пинайте сильно, я знаю, что таких тем много на форуме, я их все(по крайней мере, что нащел) перечитал и все равно туплю.
Есть код для обмена данными с COM портом. На форме есть TrackBar и TextBox. (Там еще много чего, но уже не суть). При движении TrackBar медленно TextBox обновляется более менее прилично, но если TrackBar тащить быстро, то TextBox замирает и данные в нем не обновляются, пока бегунок TrackBar не останавливается. Собственно это единственное, что сильно раздражает и в общем и целом мешает настройке оборудования. Если закомментировать строчку "while ((COMport.BytesToRead < (Length_answer + 2)) && !timer_event) ; //*****СОБСТВЕННО ЭТА СТРОКА ТОРМОЗИТ ФОРМУ****", то данные на форме начинают летать, но связи нет.(хотя иногда почему-то срабатывает) Если функцию SendCommand вызвать из другого потока, то форма не тормозит. Теперь собственно вопрос, как переделать код, чтобы основной поток мог вызвать функцию SendCommand и дождаться ответа, но форма при этом не тормозила и связь работала.
0
|
||||||
| 10.11.2017, 12:14 | |
|
Ответы с готовыми решениями:
28
Чтение данных с COM-порта Чтение данных из COM порта Чтение данных с COM-порта |
|
[Bicycle Reinventor]
|
||
| 10.11.2017, 15:24 | ||
|
Как только обработчик клика завершил работу (первый пункт завершился), основной поток просто будет простаивать и обрабатывать события от ОС как обычно. Вам не нужно ничего делать. Это тот же штатный режим, как если бы никакого нажатия на кнопку вовсе не было. Вторичный поток в это время будет делать своё дело, и вызовет event когда закончит. В подписке на event должен быть произведен Invoke, чтобы последнующий код выполнялся в основном потоке. Так результаты дойдут до основного потока.
0
|
||
|
0 / 0 / 0
Регистрация: 05.04.2017
Сообщений: 14
|
|
| 10.11.2017, 15:25 [ТС] | |
|
Именно эта строка стоит между п.1 и п.2
0
|
|
|
0 / 0 / 0
Регистрация: 05.04.2017
Сообщений: 14
|
|
| 10.11.2017, 15:32 [ТС] | |
|
у меня эта функция вызывается из сотни мест. Если все полученные данные обрабатывать только в обработчике получения данных то у меня вся программа засунется в этот обработчик.
0
|
|
|
[Bicycle Reinventor]
|
||
| 10.11.2017, 15:42 | ||
|
Логично, что нужно
Но это уже вопросы архитектуры программы. Вы свой ответ получили и уже давно: чтобы форма не висла, весь обмен данными (особенно бесконечные / длинные циклы while) нужно выполнять в отдельном потоке. Как это сделать - есть миллион и ещё десять разных способов. У меня складывается впечатление, что из-за долгой работы над задачей, у вас замылился взор. Рекомендую отложить её в сторонку, взять msdn, и внимательно там изучить следующие вопросы: 1. Thread. Что такое, как создавать, запускать, блокировать, чем отличается от основного потока. 2. AutoResetEvent и прочие механизмы синхронизации потоков. Как усыпить побочный поток и разбудить с помощью AutoResetEvent. 3. ключевое слово event. Создание событий, вызов событий, подписка на события. 4. Invoke и InvokeRequired. Выполнение кода в основном потоке из побочного. Это четыре вещи (именно в таком порядке), которые вам необходимо реализовать (как минимум) для решения проблемы зависания формы. С полученными знаниями можно будет вернуться к задаче и переосмыслить её. Если у вас код, блокирующий поток, вызывается из сотни мест, что ж.. придётся пересмотреть свою архитектуру.
0
|
||
|
0 / 0 / 0
Регистрация: 05.04.2017
Сообщений: 14
|
|
| 10.11.2017, 15:54 [ТС] | |
|
Бум думать...
Добавлено через 26 секунд Спасибо Всем.
0
|
|
|
|
||
| 10.11.2017, 16:17 | ||
|
Отдельный класс для обмена с портом. В нем метод, стартующий поток. В потоке бесконечный цикл (с признаком отмены). Также в классе есть очередь, куда вы и складываете все команды от ГУИ. Если очередь пуста-рабочий поток ждет на AutoResetEvent, только в очереди что-то появилось - идет выполнение это задачи, проверка очереди и так далее. Соответственно, в данном классе должны быть события уведомления ГУИ о прогрессе/результатах обработки и метод, который добавляет очередное задание/задания в очередь. Вот примерно такая структура, думаю, будет вполне работоспособна.
0
|
||
|
0 / 0 / 0
Регистрация: 05.04.2017
Сообщений: 14
|
|
| 10.11.2017, 16:44 [ТС] | |
|
Странно как-то, но задача неперерисовки текстбокса решилась командой
Стандарт_mTB_Step_1.Update(); между изменением тексбокса и вызовом процедуры обмена. Добавлено через 35 секунд А в остальном и так все хорошо работает.
0
|
|
|
burning1ife
|
|
| 10.11.2017, 19:31 | |
|
А нельзя ли просто делать вызовы к COM порту, когда перестали перетаскивать track?
Или поэкспериментировать с TickFrequency, чтобы уменьшить кол-во обращений к COM порту.
0
|
|
| 10.11.2017, 19:31 | |
|
Помогаю со студенческими работами здесь
29
Чтение данных с COM порта Чтение данных из com-порта Чтение данных с COM порта Чтение данных с COM-порта Чтение данных из COM порта в массив Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|