2012-09-27 19 views
1

我想知道是否有人熟悉用戶模式中的同步機制,通過這種機制,應用程序可以註冊一個「回調」函數,當另一個應用程序信號它... 我不介意在一個仲裁線程的回調。從另一個進程在用戶模式下回調,不帶額外線程

假設我有很多「工人」進程並行,並且想通知他們一個變化(無需加載數據),每個進程都需要做一些內部更新。

直接的方法是在每個線程中創建另一個線程,並有一個無限循環,等待全局事件並在之後調用回調函數。爲了表明這一點,一個過程只需要發出這個全球事件的信號。

問題是我在這個項目中會有很多並行進程,我不想爲了實現這個而將線程* n進程添加到系統中,即使它們大多數都是暫停的。

我發現的當前「解決方法」是保存我自己的「虛擬」註冊表項,並且每個進程都將「註冊註冊通知回調」,當一個應用程序想要通知其他應用程序時它會觸發寫入到這個鍵...和Windows會回調註冊到這個通知的每個進程。

還有其他想法嗎?

+0

他們可以檢查一個互斥評論狀態,而不是必須阻止。或者每個線程都可以運行一個消息循環,你可以使用'SendThreadMessage()' – Deanna

+0

我想你可以用異步管道設計一些客戶/系統模型。但這會增加程序的複雜性。如果只有一個單一的信號,並且你不可能將IPC擴展到那以外,那麼可能更像你的註冊解決方案那樣簡單些。 – Lundin

+0

那麼你可以將此功能添加到已存在的線程嗎?額外的輸入信號或Windows'WM_COPYDATA'消息? –

回答

1

更好的解決方案,不污染註冊表,將使用共享管道。所有工作人員都可以連接到命名管道服務器,並進行異步讀取。當服務器想踢人時,它只是寫一個字節。這觸發了工作人員的完成程序。 Basic example

但是,此通知與大多數其他Windows通知具有相同的缺陷。如果您的所有工作線程正在運行工作者代碼,那麼您的通知就不會到達線程 - 而且您也沒有爲此目的創建特殊線程。唯一的解決方案是CreateRemoteThread,但這是一個非常大的錘子。

0

謝謝大家了有益的思路,

最後,我碰到RegisterWaitForSingleObject這似乎只是偶然做出來。

我還在考慮在帳戶@MSalters關於在給定時間沒有足夠的自由工作者線程,因爲我假設這個回調機制依賴於相同的回調機制最Win32API的不

相關問題