Скубя си косата, опитвайки се да разбера кога един сериен порт приключи да се затваря, за да мога да го отворя отново. Оказва се, че CloseHandle()
се връща преди портът действително да бъде отключен.
Отварям сериен порт с помощта на CreateFile(FILE_FLAG_OVERLAPPED)
, свързвам го с CompletionPort с помощта на CreateIoCompletionPort()
, чета/пиша в него с помощта на ReadFile()
, WriteFile()
и го затварям с помощта на CloseHandle()
.
Забелязах, че ако затворя и отворя отново сериен порт достатъчно бързо, получавам ERROR_ACCESS_DENIED
обратно от CreateFile()
. Това се случва въпреки факта, че чакам CloseHandle()
да се върне, след което чакам всички неизпълнени операции за четене/запис, свързани с този манипулатор, да се върнат от порта за завършване. Със сигурност има по-добър начин :)
Как да затворя синхронно сериен порт? Моля, без повторни цикли, sleep() или други евтини хакове.
РЕДАКТИРАНЕ: Може би това има нещо общо с използването на портове за завършване и 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