2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
|
|
1 | |
Приём данных компонентом TBComPort в отдельном потоке18.08.2012, 14:06. Показов 3581. Ответов 19
Метки нет (Все метки)
Добрый день, возник следующий вопрос:
Имеется компонент для работы с COm портом, который принимает данные из UART по своему Event'у. Вопрос: как в отдельном потоке отслеживать event приёма данных компонента TBComPort и передавать полученные данные из отедльного потока в общий поток?
0
|
18.08.2012, 14:06 | |
Ответы с готовыми решениями:
19
Производительный приём данных в отдельном потоке Приём данных в цикле компонентом IdTCPServer Отрисовка данных в отдельном потоке Ввод данных в отдельном потоке |
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
|
|
18.08.2012, 19:00 [ТС] | 8 |
Спасибо за ответы, а можете привести пример такой реализации на примере обработки нажатия кнопки ButtonClick?
0
|
18.08.2012, 19:39 | 9 |
Вообще то сильно много кода...
Пример есть в книге Архангельского 7-издании ищите там класс TThread Что касается динамического создания- так это зависит от реализации программы в общем. Добавлено через 36 минут Что касается синхронизации Объекты синхронизации
1
|
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
|
||||||
19.08.2012, 22:30 [ТС] | 10 | |||||
По поводу синхронизации визуальных компонентов: столкнулся с проблемой невозможности скомпилировать код при синхронизации для вывода строки в Label
В чём тут проблема?
0
|
19.08.2012, 23:03 | 11 | ||||||||||
Добавлено через 1 минуту
1
|
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
|
||||||
20.08.2012, 10:33 [ТС] | 12 | |||||
Спасибо за помощь! В итоге я примерно всё таки создал что хотел, однако код всё таки не работает =)
Разместил на главной форме компонент, по событию приёма сообщения с ком порта выставил NewThread->Resume(); А в коде потока след код:
В чём здесь может быть дело?
0
|
20.08.2012, 13:36 | 13 |
По огрызку кода ничего не скажешь...тем более компонент нестандартный...как делается прием в обычном коде?
Кстати компонент визуальный ( всмысле от TWinControl ) ? Непонятно что делает RXProc()
0
|
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
|
||||||
20.08.2012, 14:00 [ТС] | 14 | |||||
В обычном коде в общей форме приём данных осуществляется по событию BComPort1RxChar
0
|
20.08.2012, 14:45 | 15 | ||||||||||
Ну так в коде с потоком этот обработчик тоже должен быть определен...
Добавлено через 14 минут Возможно стоит сделать что-то вроде этого.
0
|
Практикантроп
4840 / 2725 / 533
Регистрация: 23.09.2011
Сообщений: 5,795
|
|
20.08.2012, 15:26 | 16 |
Событие BComPort1RxChar возникает при приеме очередного байта данных; при этом Count указывает общее количество принятых байтов в буфере, размер которого в параметрах компонента. После выполнения операций чтения (Read(), ReadStr()) или очистки (ClearBuffer()) Count обнуляется.
Потоки..., синхронизация... - как-то вы себе все усложнили. Я, возможно, не прав, но, помнится, с этим компонентом у меня сразу все получилось; и ось не огрызалась, как было с некоторыми другими компонентами обмена по rs232.
0
|
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
|
|
20.08.2012, 15:53 [ТС] | 17 |
Читать данные в отдельном потоке изначально хотел потому, что рассчитывал на уменьшение потерьб данных. Работая с компонентом в общей форме некоторые данные иногда не принимались, однако и в отдельном потоке (по крайней мере с моей реализацией) ситуация та же - где то половина данных принимается от случая к случаю =(
0
|
Практикантроп
4840 / 2725 / 533
Регистрация: 23.09.2011
Сообщений: 5,795
|
|
20.08.2012, 16:01 | 18 |
Потерь данных вообще не должно быть, если скорость обмена выставлена верно (этим служба занимается). Вот только вы считываете из буфера после каждого пришедшего байта и Count не учитываете вообще. Я иногда поступаю так (для определения конца передачи) - по таймеру сравниваю значение счетчика с предыдущим сохраненным и если перестал изменяться, то считаю, что передача закончена и перехожу с чтению буфера. Если идет непрерывный поток, то считываю порциями, скажем по 500 б. Комп все равно быстрее обработает порцию, прежде чем "наполнится" новая.
1
|
2 / 2 / 2
Регистрация: 16.10.2011
Сообщений: 179
|
|
20.08.2012, 16:24 [ТС] | 19 |
Nick42, приведите, пожалуйста, пример реализации
Спасибо
0
|
Практикантроп
4840 / 2725 / 533
Регистрация: 23.09.2011
Сообщений: 5,795
|
|
20.08.2012, 16:59 | 20 |
Я же в личку давал ссылку на проект (как пример реализации)... . Сейчас под рукой нет простенького шаблона под этот компонент. А готовая программа чересчур запутанная; только усложнит все.
Могу сказать, что я обхожусь такими командами: ->Close(), ->Open(), ->SetDTR(0) ->SetRTS(0) (иногда), ->ClearBuffer(1,1), ->Read(), ->Write() и анализирую if(comm->Connected). Ну, еще ->BaudRate, если скорости меняются.
0
|
20.08.2012, 16:59 | |
20.08.2012, 16:59 | |
Помогаю со студенческими работами здесь
20
Отправка данных по таймеру в отдельном потоке Принятие сетевых данных NetworkStream в отдельном потоке Обновление данных на форме созданной в отдельном потоке Dispatcher.BeginInvoke: обновление данных в ListView в отдельном потоке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |