为啥 GetQueuedCompletionStatus() 不返回操作类型?
Posted
技术标签:
【中文标题】为啥 GetQueuedCompletionStatus() 不返回操作类型?【英文标题】:Why GetQueuedCompletionStatus() does not return operation type?为什么 GetQueuedCompletionStatus() 不返回操作类型? 【发布时间】:2015-02-25 18:32:04 【问题描述】:GetQueuedCompletionStatus()
出列完成通知,但它不返回它是什么类型的通知(例如,读取通知,写入通知)。
我有责任跟踪我启动了哪些操作,例如,当我使用 WSARecv()
时,我在 OVERLAPPED
结构中添加一个标志,指示这是什么操作(在这种情况下读取),以及何时我出列通知,我读了这个标志。那么有谁知道GetQueuedCompletionStatus()
为什么不返回操作的类型吗?
【问题讨论】:
因为您应该自己跟踪。你拿回来的指针就是你的钥匙。从 OVERLAPPED 派生出自己的结构来存储任何额外的上下文是很常见的。 实际操作与GQCS
无关。这取决于您。它应该这样管理(作为每个 IO 状态的一部分,通常通过 OVERLAPPED 结构的扩展)。用于实际 IO 的 IOCP 编程(你也可以在没有 IO 的情况下使用它们)是一种状态机风格的编程,你管理所说的状态。
【参考方案1】:
它为什么要关心?您可以通过 API 传递用户数据,从而通过GetQueuedCompletionStatus()
提取完成,那么您为什么还需要其他任何东西呢?由于您可以使用PostQueuedCompletionStatus()
发布自己的完成,因此您可以完成无限数量的“操作”,因此将其传递到“扩展的OVERLAPPED
结构中,您可以传递任何内容...
如果您可以传递自己的单独标志,那么它实际上并不会消除将额外的额外内容作为扩展 OVERLAPPED
结构传递的需要,因为能够传递数据缓冲区和其他信息以及无论如何操作,所以一个额外的标志不太值得拥有......我的设计需要的比你的设计需要的多,所以让我们处理 API 设计者给我们的方法......
【讨论】:
以上是关于为啥 GetQueuedCompletionStatus() 不返回操作类型?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?