Я дергаю за волосы, пытаясь понять, когда закрывается последовательный порт, чтобы я мог снова его открыть. Оказывается, CloseHandle()
возвращается до того, как порт действительно разблокируется.
Я открываю последовательный порт с помощью CreateFile(FILE_FLAG_OVERLAPPED)
, связываю его с CompletionPort с помощью CreateIoCompletionPort()
, читаю / записываю в него с помощью ReadFile()
, WriteFile()
и закрываю с помощью CloseHandle()
.
Я заметил, что если я закрываю и снова открываю последовательный порт достаточно быстро, я получаю ERROR_ACCESS_DENIED
обратно от CreateFile()
. Это происходит, несмотря на то, что я жду возврата CloseHandle()
, а затем ожидаю, что все невыполненные операции чтения / записи, связанные с этим дескриптором, вернутся из порта завершения. Наверняка есть способ получше :)
Как синхронно закрыть последовательный порт? Не используйте повторные попытки, режим сна () или другие дешевые приемы.
РЕДАКТИРОВАТЬ: возможно, это как-то связано с тем, что я использую порты завершения и FILE_FLAG_OVERLAPPED. Я получаю обратный вызов после завершения операций чтения / записи. Есть ли какой-то обратный вызов на закрытие порта?
DuplicateHandle
? - person Ben Voigt   schedule 17.01.2012ReadFileEx
иWriteFileEx
. Это также проще, потому что APC запускаются только тогда, когда поток переходит в тревожное ожидание, поэтому нет проблем с синхронизацией между потоками (просто будьте осторожны с повторным входом). - person Ben Voigt   schedule 17.01.2012DuplicateHandle
. - person Gili   schedule 17.01.2012