【问题标题】:A question about windows iocp关于windows iocp的一个问题
【发布时间】:2009-05-06 16:58:05
【问题描述】:

当我在 Windows Vista 中编写一个关于 IO 完成端口的程序时, 第一个示例不起作用,GetQueuedCompletionStatus() 无法获取 任何重叠的结构。

所以我将 OVERLAPPED 结构放在全局范围内,它的效果非常好。 这是为什么呢?

代码1:

int main()
{
    OVERLAPPED o;
    ..
    CreateIoCompletionPort(....);

    for (int i = 0; i<10; i++)
    {
        WriteFile(..,&o);

        OVERLAPPED* po;
        GetQueuedCompletionStatus(..,&po);
    }


}

代码2:

OVERLAPPED o;

int main()
{

    ..
    CreateIoCompletionPort(....);

    for (int i = 0; i<10; i++)
    {
        WriteFile(..,&o);

        OVERLAPPED* po;
        GetQueuedCompletionStatus(..,&po);
    }


}

【问题讨论】:

  • 编辑了我的帖子。您可能想再看一遍。

标签: c++ windows visual-c++ iocp


【解决方案1】:

好的!这是来自OVERLAPPED 结构的 MSDN 页面的备注部分:

在函数调用中使用该结构之前,该结构的任何未使用成员都应始终初始化为零。否则,函数可能会失败并返回 ERROR_INVALID_PARAMETER。

全局变量是零初始化,而局部变量不是。如果您打算使用以前的代码,则需要将内存清零:

int main() {
    OVERLAPPED o = {0}; 
    // ...

【讨论】:

  • 在前一个程序中,GetQueuedCompletionStatus() 只是在那里等到时间结束。看来我无法调用 GetLastError()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
相关资源
最近更新 更多