【发布时间】:2021-10-16 12:25:49
【问题描述】:
请告诉我 GetQueuedCompletionStatus 中的 dwMilliseconds 参数具体负责什么?
是的,我知道一切都写在 MSDN 上:https://docs.microsoft.com/en-us/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus
dw毫秒
调用者愿意等待的毫秒数 完成数据包出现在完成端口。如果完成 数据包未在指定时间内出现,函数次数 out,返回 FALSE,并将 *lpOverlapped 设置为 NULL。
如果 dwMilliseconds 为 INFINITE,则函数永远不会超时...
但我无法理解——“等待完成数据包出现”。
假设我调用了 WSARecv 函数,该函数将读取任务放在完成端口上,并且我有条件地设置 dwMilliseconds == 1000 (ms)。在这种情况下是什么意思 - “等待完成数据包出现”??
-这是从调用WSARecv到完成端口出现FINISHED任务的时间,可以使用函数GetQueuedCompletionStatus获取?
-或者是调用 WSARecv 函数和读取任务将被放置在完成端口上的时间之间的时间?
我完全糊涂了。
【问题讨论】:
-
这一次你等待从端口弹出的数据包。如果一段时间内没有数据包(或 iocp 上的活动线程限制) - GetQueuedCompletionStatus 返回超时错误。并且 WSARecv 不是 将读取任务放在完成端口上 - 它会将读取任务 (IRP) 放到驱动程序中。任务完成时 - 驱动程序完成 IRP 并将其放入 iocp。
-
时间从调用GetQueuedCompletionStatus开始
-
什么是 BCAREq?
-
iocp 不知道 WSARecv 并且结果调用(和超时)不依赖于这个和其他 I/O 操作。等待期从
GetQueuedCompletionStatus调用开始,如果dwMilliseconds没有从端口弹出数据包 - 等待停止并返回 -
GetQueuedCompletionStatus 等待某物获得的时间。 WSARecv 在完成时发布一个完成。 (不是什么时候开始的。)