Сегодня я узнал, что могу вызвать CreateIoCompletionPort()
, а затем передать возвращенный HANDLE
в WaitForSingleObject()
:
#include <Windows.h>
int main()
{
HANDLE h = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 0);
auto bRes = PostQueuedCompletionStatus(h, 1, 2, 0);
if (!bRes) {
abort();
}
auto dwRes = WaitForSingleObject(h, INFINITE);
if (dwRes != WAIT_OBJECT_0){
abort();
}
LPOVERLAPPED pOvr;
DWORD cb;
ULONG_PTR key;
bRes = GetQueuedCompletionStatus(
h, &cb, &key, &pOvr, INFINITE); // <-- returns 1, 2, nullptr
if (!bRes) {
abort();
}
dwRes = WaitForSingleObject(h, INFINITE); // <-- blocks here
return 0;
}
Он работает, как и ожидалось, на моем компьютере с Windows 10.
Известно ли такое поведение, является ли оно законным или задокументировано? Я ничего не смог найти об этом.
dwRes = WaitForSingleObject(h, INFINITE); // <-- blocks here
- действительно заблокировать? Уверен ? просто интересуюсь - person RbMm   schedule 21.09.2016