Здравствуйте, Lomion, Вы писали:
L>Здравствуйте, gordienkos, Вы писали:
G>>Реальные таймауты чтения записи задаются SetCommTimeout. И при некотором везении WaitForSingleObject никогда не вернет WAIT_TIMEOUT, при том, что новых данных в порту нет.
G>>IMHO: G>>Если чтение в обработчике оконного сообщения, тогда непонятно что за ReadFile в бесконечном цикле. G>>Если используете же треды -- то overlapped там нафиг не нужен. L>Ну а если мне необходимо использовать таймауты???
L>А вообще, из-за чего такая фигня происходит???
Я далеко не гуру, и могу только предполагать.
Асинхронное чтение заканчивается либо когда полностью заполнен выделенный буфер, либо, когда данных нет или недостаточно, то по истечении таймаута, заданного в SetCommTimeout.
В первых двух циклах чтения данные поступают, заполняют трех-байтовый буфер, асинхронное чтение заканчивается до следующего запуска ReadFile.
В третий раз данные не приходят (задержка 1000 в отправителе), WaitForSingleObject возвращает WAIT_TIMEOUT и запускается новая операция чтения, при том что старая вероятно еще не закончена. И дальше начинается цирк...
А при увеличении задержки в WaitForSingleObject, операции чтения разносятся во времени и перестают накладываться друг на дгуга. Это и создает видимость правильной работы.