![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#7
|
|||
|
|||
![]() Народ, тема не закрыта. Помогите советом пожалуйста. Почитав статей и книг по организации работы с com портом в параллельном потоке, все сходятся на мысли что поток чтения данных с ком порта надо делать так:
Код:
... procedure COM_Thread.Execute; begin While not Terminated do begin If not WaitCommEvent(hCOM,TMask,@Ovr) then if GetLastError = ERROR_IO_PENDING then WaitForSingleObject(Ovr.hEvent, INFINITE);//Ожидаем приема до бесконечности ClearCommError(hCOM,xn,@StatCOM);//Получаем состояние порта в StatCOM xn:= StatCOM.cbInQue;//Реальное количество байт в буфере If xn>0 then If ReadFile(hCOM,paket,xn,xn,@ovr) then SendMessage(Form1.Handle,wmCOM,1,0); end; end; Код:
Ovr.hEvent:= CreateEvent(nil,True,False,nil) Все хорошо, но только тогда, когда приложение ничего не делает и только ждет каких то данных от порта. Тогда да, пакет пришел в порт, дополнительный поток его принял, обработал, отправил сообщение главному окну, в главном потоке сообщение обработалось. Но у меня приложение регулярно в цикле опрашивает 255 устройств. Опрос идет из главного потока. Там я пишу в порт Код:
WriteFile(hCOM,paket,15,xn,@Ovr); Так вот, когда идет последовательный опрос, с устройств тут же приходит пакет-ответ. НО дополнительный поток НЕ обрабатывает эти пакеты, пока не прогонится весь цикл. А когда цикл прогонится, обрабатывается всего лишь один или два пакета, которые остались в буфере. остальное пропадает. Подскажите как сделать синхронизацию между потоками грамотно и можно ли это сделать в делфи7 вообще? |