2009-05-06 72 views
2

当我编写有关Windows Vista中的IO完成端口的程序时,第一个示例不起作用,并且GetQueuedCompletionStatus()不能获得任何OVERLAPPED结构的 。有关Windows iocp的问题

因此,我把OVERLAPPED结构放在全局范围内,它的工作原理非常惊人。 这是为什么?

CODE1:

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

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

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


} 

CODE2:

OVERLAPPED o; 

int main() 
{ 

    .. 
    CreateIoCompletionPort(....); 

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

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


} 
+0

有时候编辑我的文章。你可能想再看一下。 – dirkgently 2009-05-06 17:46:51

回答

3

好吧!这是从OVERLAPPED结构的MSDN页面的备注部分:在一个函数调用中使用的结构之前

这种结构的任何未使用的成员应该总是初始化为零。否则,该函数可能会失败并返回ERROR_INVALID_PARAMETER。

全局变量是零初始化,而当地人不是。如果你打算使用前面的代码,你需要将内存清零:

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

在前一个程序中,GetQueuedCompletionStatus()只是等待直到时间结束。看来我无法调用GetLastError()。 – Kim 2009-05-06 17:15:03