今天我了解到我可以致电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盒子上按预期工作。
这种行为是已知的还是合法的还是有记录的?我无法找到任何相关信息。
答案 0 :(得分:3)
如果您阅读WaitForSingleObject()
documentation,则I / O完成端口 NOT 是允许的句柄类型:
WaitForSingleObject
函数可以等待以下对象:
- 更改通知
- 控制台输入
- 事件
- 内存资源通知
- 互斥
- 过程
- 信号量
- 发
- 等待计时器
要等待完成事件到达端口,您必须自己将句柄传递给GetQueuedCompletionStatus()
并让它阻塞,直到事件到达或发生超时。
#include <Windows.h>
int main()
{
HANDLE h = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 0);
auto bRes = PostQueuedCompletionStatus(h, 1, 2, 0);
if (!bRes) {
abort();
}
LPOVERLAPPED pOvr;
DWORD cb;
ULONG_PTR key;
bRes = GetQueuedCompletionStatus(
h, &cb, &key, &pOvr, INFINITE); // <-- returns 1, 2, nullptr
if (!bRes) {
abort();
}
bRes = GetQueuedCompletionStatus(
h, &cb, &key, &pOvr, INFINITE); // <-- blocks here
return 0;
}
答案 1 :(得分:1)
摘要: