Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

потоки [D6, D7, WinXP]


Страницы:   1 2 3

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]


> Каким образом можно исключить такую ситуацию?
>


Синхронизировав обращения к ресурсу (СОМ-порту в твоем случае) со стороны более чем одного потока - см. крит.секции, мьютексы, семафоры

В целом же такая логика ничем не оправдана. С коммуникационным ресурсом (тем самым СОМ-портом) должен взаимодействовать только один тред - транспортный. Все остальные треды, заинтересованные во вводе/выводе с использованием этого ресурса, должны делать запросы транспортному треду на прием/передачу требуемых данных, ставя эти запросы в очередь. Транспортный тред выбирает эти запросы из очереди и исполняет их, формируя результаты и передавая их заинтересованному треду.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо