gpt4 book ai didi

c++ - 使用 GetQueuedCompletionStatusEx 将多个完成从队列中取出

转载 作者:行者123 更新时间:2023-11-28 04:03:06 29 4
gpt4 key购买 nike

我正在尝试使用 GetQueuedCompletionStatusEx从 I/O 完成端口 (IOCP) 中取出多个完成。

void GetPackets() {
OVERLAPPED_ENTRY pEntries;
ULONG NumEntries;
if (!GetQueuedCompletionStatusEx(PointIOCP, &pEntries, PENDING_RECVS, &NumEntries, 0, false)) {
printf("Get Queued Completion Status - Point Error: %i\n", GetLastError());
return;
}

if (NumEntries = 0) { return; }

printf("Got Entries!\n");
for (unsigned int i = 0; i < NumEntries; i++) {
NetPacket_Recv* Packet = reinterpret_cast<NetPacket_Recv*>(pEntries[i].lpOverlapped);
}
}

错误与 pEntries[i].lpOverlapped 有关。编译器告诉我 OVERLAPPED_ENTRY 不存在 [] 运算符。根据文档,pEntries 应该接收一个 OVERLAPPED_ENTRY 结构数组。

lpCompletionPortEntries: Receives an array of OVERLAPPED_ENTRY structures that hold the entries.

当我定义 pEntries 时,我只声明了一个 OVERLAPPED_ENTRY 实例。 如何将 pEntries 定义为指向 OVERLAPPED_ENTRY 数组的指针?

最佳答案

你引用自documentation ,但您似乎错过了您引用的代码段上方的重要部分:

lpCompletionPortEntries [out]

On input, points to a pre-allocated array of OVERLAPPED_ENTRY structures.

On output, receives an array of OVERLAPPED_ENTRY structures that hold the entries. The number of array elements is provided by ulNumEntriesRemoved.

OVERLAPPED_ENTRY pEntries; 声明一个单个 OVERLAPPED_ENTRY,而不是OVERLAPPED_ENTRY数组> 元素。这就是 pEntries[i] 不起作用的原因,因为 pEntries 不是数组(甚至不是指针)。

当您将 &pEntries 传递给函数时,您传递的是指向 1 OVERLAPPED_ENTRY 的指针,但是您将 ulCount 指针设置为PENDING_RECVS,因此该函数希望您传入一个指向数组的指针,该数组中至少包含 PENDING_RECVSOVERLAPPED_ENTRY 个元素。你没有这样做(除非 PENDING_RECVS 为 1)。

此外,NumEntries = 0 是赋值,而不是比较。你应该得到一个关于那个的编译器警告。您需要使用 operator== 而不是 operator=

尝试更像这样的东西:

void GetPackets() {
OVERLAPPED_ENTRY Entries[PENDING_RECVS];
ULONG NumEntries = 0;
if (!GetQueuedCompletionStatusEx(PointIOCP, Entries, PENDING_RECVS, &NumEntries, 0, FALSE)) {
printf("Get Queued Completion Status - Point Error: %u\n", GetLastError());
return;
}

if (NumEntries == 0) { return; }

printf("Got Entries!\n");
for (ULONG i = 0; i < NumEntries; ++i) {
NetPacket_Recv* Packet = reinterpret_cast<NetPacket_Recv*>(Entries[i].lpOverlapped);
...
}
}

关于c++ - 使用 GetQueuedCompletionStatusEx 将多个完成从队列中取出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59180706/

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