2009-05-06 67 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