2008-12-05 154 views
1

我想在实时监控几个目录在一个线程中的变化,所以我决定用GetQueuedCompletionStatus时异步使用ReadDirectoryChangesW()方法。这里是我的代码:线程死锁异步

static DWORD WINAPI Routine(LPVOID lParam) 
{ 
    FileSystemWatcher* obj = (FileSystemWatcher*)lParam; 

    obj->hDir[0] = CreateFile(
     obj->WatchedDir[0].c_str(), 
     GENERIC_READ|GENERIC_WRITE, 
     FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 
     NULL, 
     OPEN_EXISTING, 
     FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, 
     NULL 
    ); 

    obj->hDir[1] = CreateFile(
    obj->WatchedDir[1].c_str(), 
    GENERIC_READ|GENERIC_WRITE, 
    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 
    NULL, 
    OPEN_EXISTING, 
    FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, 
    NULL 
    ); 

    if(INVALID_HANDLE_VALUE == obj->hDir[0] || INVALID_HANDLE_VALUE == obj->hDir  [1]) 
{ 
    return false; 
} 

obj->IOCPHandle[0] = CreateIoCompletionPort(obj->hDir[0], NULL, 0, 1); 
obj->IOCPHandle[1] = CreateIoCompletionPort(obj->hDir[1], NULL, 0, 1); 

if (obj->IOCPHandle[0] == INVALID_HANDLE_VALUE || obj->IOCPHandle[1] == INVALID_HANDLE_VALUE) 
{ 
    return false; 
} 

    char buf[ 2*(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH) ]; 
    FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION *)buf; 
    DWORD BytesReturned; 
    LPOVERLAPPED overLap = NULL; 

    m_pFileNotifyInfo = pNotify; 
    dirEvents[0] = CreateEvent(NULL, TRUE, FALSE, NULL); 
    dirEvents[1] = CreateEvent(NULL, TRUE, FALSE, NULL);*/ 

    while(true) 
    { 

    BOOL success = ReadDirectoryChangesW(obj->hDir[0], 
    pNotify, 
    sizeof(buf), 
    true, 
    FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME, 
    &BytesReturned, 
    overLap, 
    NULL); 
    BOOL success1 = ReadDirectoryChangesW(obj->hDir[1], 
    pNotify, 
    sizeof(buf), 
    true, 
    FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME, 
    &BytesReturned, 
    overLap,  
       NULL); 

    LPOVERLAPPED theOverLap; 
    PULONG_PTR lpCompKey = NULL; 
    if (GetQueuedCompletionStatus(obj->IOCPHandle[0], &BytesReturned, lpCompKey, &overLap, 100)) 
    { 
    cout<<"First Dir Changed"<<endl; 
    } 

    if (GetQueuedCompletionStatus(obj->IOCPHandle[1], &BytesReturned, lpCompKey, &overLap, 100)) 
    { 
    cout<<"Second Dir Changed"<<endl; 
    } 

    cout<<"Nothing happened yet"<<endl; 

     } 

    return 0; 
} 

这里的时候,我跑我的代码,我没有理由线程块,不管我设置为则GetQueuedCompletionStatus()函数的最后一个参数什么价值。我不知道我为什么遇到这个问题。谁能告诉我的原因?非常感谢!

回答

1
  1. 你必须指定异步I有效OVERLAPPED结构/ O工作。您正在使用NULL(LPOVERLAPPED overLap = NULL;)。

  2. 并发I/O操作必须使用单独的OVERLAPPED结构,不只是一个。

  3. 你确定你需要IOCP呢?我只想填补hEvent在重叠的结构和做这些事件WaitForMultipleObjects