我有創建命名管道這樣的主題: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
感謝
Windows異步I/O與UNIX不同。與其等待就緒狀態,然後發出I/O操作,不如發出I/O操作並等待它完成。當您發出I/O操作時,您可以指定一個事件對象,當I/O完成時(或者有其他各種選項),然後您等待事件句柄。等待管道手柄永遠沒有意義。 –
哦,有趣的是,謝謝@哈里約翰斯頓 - 其他時間間隔 - 你會建議我如何中斷正在等待'ReadDirectoryChangesW'完成例程的輪詢?我需要在每次需要添加其他路徑以便觀看時中斷投票。 – Noitidart
如果我已經理解你正在做的事情,使用事件對象而不是管道應該可以工作。 –