gpt4 book ai didi

winapi - 完成端口上的 WaitForSingleObject()?

转载 作者:行者123 更新时间:2023-12-02 17:24:44 28 4
gpt4 key购买 nike

今天我了解到我可以调用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 机器上按预期工作。

这种行为是否已知或合法或有记录?我找不到任何相关信息。

最佳答案

如果您阅读 WaitForSingleObject() documentation ,I/O 完成端口不是允许的句柄类型:

The WaitForSingleObject function can wait for the following objects:

  • Change notification
  • Console input
  • Event
  • Memory resource notification
  • Mutex
  • Process
  • Semaphore
  • Thread
  • Waitable timer

要等待完成事件到达端口,您必须自行将句柄传递给 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;
}

关于winapi - 完成端口上的 WaitForSingleObject()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39602908/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com