Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как явно вызвать механизм APC


Автор: AlekXL 14.6.2013, 15:46
у меня есть код, вызывающий ReadFileEx с параметром FileIOCompletetion, который указателем на функцию. 
Порой немедленный вызов GetOverlappedResult возвращает TRUE, тем самым показывая, что буфер записан, однако возвращаемое значение lpNumberOfBytesTransferred иногда при этом оказывается нулевым.
Единственный способ получить корректный размер(я думаю) записанных данных - это войти в Alertable State и дождаться, когда будет вызван callback FileIOCompletetion 

Как это сделать? Приходит на ум SleepEx(n,TRUE), но как я понимаю если первый параметр будет нулевым, то поток пропустит весь свой таймслайс, а если больше - потратится время на вход и выход в Kernel Mode.
Мне нужна функция, которая вынудит систему вызвать все запланированные коллбэки(которых может быть 0 или больше), и немедленно вернуть управление к точке вызова.

Автор: Illusion Dolphin 14.6.2013, 23:26
Цитата

возвращает TRUE, тем самым показывая, что буфер записан, однако возвращаемое значение lpNumberOfBytesTransferred иногда при этом оказывается нулевым.

Тут есть несколько вариантов. Он может быть успешно прочитал 0 байтов smile А может быть неверно заполнены поля в LPOVERLAPPED и тогда может быть:
Цитата

If the hEvent member of the OVERLAPPED structure is NULL, the system uses the state of the hFile handle to signal when the operation has been completed. Use of file, named pipe, or communications-device handles for this purpose is discouraged. It is safer to use an event object because of the confusion that can occur when multiple simultaneous overlapped operations are performed on the same file, named pipe, or communications device. In this situation, there is no way to know which operation caused the object's state to be signaled.

А т.к. кода нету то и не понятно, что происходит. В любом случае надо разобраться с тем, что не так, а не городить SleepEx и тому подобное, имхо.

Автор: bems 20.6.2013, 03:54
Цитата(AlekXL @  14.6.2013,  15:46 Найти цитируемый пост)
Приходит на ум SleepEx(n,TRUE), но как я понимаю если первый параметр будет нулевым, то поток пропустит весь свой таймслайс, а если больше - потратится время на вход и выход в Kernel Mode.
тревожное ожидание это всегда кернелмод, так что тут не сэкономить

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)