![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
потоки [D6, D7, WinXP]
Mixal__ © (2006-12-06 07:26:00)Добрый день. Вот такой вопрос профессионалам:
Есть программа создающая отдельный thread, в котором идёт опрос устройства(обращение к COM порту посредством ReadFile/WriteFile) через промежутки времени (sleep). В основной программе также есть обращения к этому устройству. Дело в том, что устройство может обработать последующий запрос только спустя некоторое время(время обработки запроса). Вызовы из потока могут наступить в любое время, когда ещё не обработан устройством вызов из главной программы. Каким образом можно исключить такую ситуацию?
Орион (2006-12-06 09:50:00) [41]> выход ли это из положения?
неа.
> И с чего Sleep должен глючить... этож функция виндов....
:))
Mixal__ (2006-12-06 09:37:00) [42]Не использовать поток не получится т.к делаю плугин dll для чужой программы...
Сделать работу с устр-вом в одном месте тоже врятли получится...
При инициализации dll создаётся поток в котором идёт опрос...
Также есть вызываемые в любой момент из dll функции, которым также необходимо работать с устройством...
Так... В функции передачи команды устройству использовал критическую секцию...
вначале функции
EnterCriticalSection( LockSection);
... тут работаю с портом ....
Sleep(150); // жду когда команду обработает устр-во гарантированно
LeaveCriticalSection(LockSection);
---- end;
выход ли это из положения?
И с чего Sleep должен глючить... этож функция виндов....
Kolan (2006-12-06 08:46:00) [43]> Сергей М
:)
Kolan (2006-12-06 08:45:00) [44]> (sleep
Вот это для жадержек обращения вообще не используй. Источник ошибок. Они возникают на машинах с разной производительностью.
> Вызовы из потока могут наступить в любое время, когда ещё
> не обработан устройством вызов из главной программы.
Всю работу с устр-вом сделай в одном месте(доп поток для этого хорошее дело). И всегда жди ответ. Ответ пришел, шли новый запрос. Можно сделать очередь запросов, но это я думаю лишнее.
Ожидать удобнос пом WaitFro функций, например WaitForSingleObject
Сергей М. (2006-12-06 08:41:00) [45]
> Каким образом можно исключить такую ситуацию?
>
Синхронизировав обращения к ресурсу (СОМ-порту в твоем случае) со стороны более чем одного потока - см. крит.секции, мьютексы, семафоры
В целом же такая логика ничем не оправдана. С коммуникационным ресурсом (тем самым СОМ-портом) должен взаимодействовать только один тред - транспортный. Все остальные треды, заинтересованные во вводе/выводе с использованием этого ресурса, должны делать запросы транспортному треду на прием/передачу требуемых данных, ставя эти запросы в очередь. Транспортный тред выбирает эти запросы из очереди и исполняет их, формируя результаты и передавая их заинтересованному треду.