2016-07-15 54 views
0

我有創建命名管道這樣的主題:CreateNamedPipe時和WaitForMultipleObjectsEx

CreateNamedPipe('\\\\.\\pipe\\dirwatcher', PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE, 1, 1, 1, 0, null); 

然後我產卵名爲「輪詢」另一個線程這其中有手錶文件。我想讓它等待該管的,所以我可以打斷無限調查。

我創建這個輪詢線程管道是這樣的:

pipe = CreateFile('\\\\.\\pipe\\dirwatcher', GENERIC_READ, FILE_SHARE_READ, null, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, null); 

然後我嘗試在此管道這樣的等待:

對於這種情況LP_HANDLES是隻有一個元素的數組,pipe

rez_wait = WaitForMultipleObjectsEx(LP_HANDLES.length, LP_HANDLES, false, INFINITE, true); 
console.log('rez_wait:', rez_wait); 

然而,這並不會等待,並immeidately返回0。我用重疊的標誌都創建命名管道和連接到它。有誰知道如何解決這一問題?

這裏是我的代碼,具體地講,它是JS-ctypes的:

創建管: https://github.com/Noitidart/jscFileWatcher/blob/master/DirectoryWatcherWorkerSubscript.js#L91-L99

獲得在輪詢線程管道: https://github.com/Noitidart/jscFileWatcher/blob/master/DirectoryWatcherPollWorker.js#L53-L64

等待上管: https://github.com/Noitidart/jscFileWatcher/blob/master/DirectoryWatcherPollWorker.js#L89

感謝

+4

Windows異步I/O與UNIX不同。與其等待就緒狀態,然後發出I/O操作,不如發出I/O操作並等待它完成。當您發出I/O操作時,您可以指定一個事件對象,當I/O完成時(或者有其他各種選項),然後您等待事件句柄。等待管道手柄永遠沒有意義。 –

+0

哦,有趣的是,謝謝@哈里約翰斯頓 - 其他時間間隔 - 你會建議我如何中斷正在等待'ReadDirectoryChangesW'完成例程的輪詢?我需要在每次需要添加其他路徑以便觀看時中斷投票。 – Noitidart

+1

如果我已經理解你正在做的事情,使用事件對象而不是管道應該可以工作。 –

回答

1

你不能等到使用WaitForMultipleObjectsEx管道作爲講話中指出:

WaitForMultipleObjectsEx功能可在lpHandles指定下列任何對象類型的句柄陣列:

  • 更改通知
  • 控制檯輸入
  • 事件
  • 內存資源通知
  • 互斥
  • 過程
  • 信號燈
  • 螺紋
  • 可等待計時器

你必須使用PeekNamedPipe這個工作(沒有按」等待管道是空的)或者你可以簡單地做一個塊在管道荷蘭國際集團ReadFile

我遇到了同樣的問題前一段時間,我已經通過等待與WaitForSingleObject的事件,我設置,如果我把東西放到管道解決它。我必須這樣做,因爲我有幾個管道,只有一個「讀取器線程」被事件喚醒,並且使用了PeekNamedPipe來檢查哪個管道包含數據(並且我不想創建被阻塞的多個「讀取器線程」在ReadFile調用中)。

無論如何對我來說很奇怪,你可以等待幾乎所有使用WaitForMultipleObjects除了管道(這是非常惱人的!)。

+2

管道並不是一個真正的特例。您不能等待文件對象,也不能等待串口,窗口工作站,桌面或內存映射。可以說,它是一個奇怪的控制檯輸入,是你*可以等待的唯一I/O對象。 (當然,從廣義上講,各種不同類型的I/O都有自己的語義。) –

+0

請注意,您需要小心使用事件來指示您已將某些東西放入管道中。如果管道的緩衝區不夠大,無法適應您正在編寫的數據,則會導致死鎖。如果你不想每個管道有一個線程,通常最好使用異步I/O。 (或根據你的情況,你可以考慮使用共享內存或類似的管道。) –

+0

@HarryJohnston同意。這是一個非常受控制的環境(並且很快實施),在這個環境中,我使用了事件,大部分時間管道都是空的,只要管道內有某物在睡覺之前再次進入「閱讀器線程」閱讀狀態。 –