2010-08-17 95 views
0

我有一個線程需要在生成消息後立即發送消息(使用SendInput發送的模擬鼠標事件)。我希望這發生在沒有睡眠的循環中;添加任何睡眠傷害性能,因爲我基本上希望事件一旦生成就立即進入事件循環。當然,我也不希望消費者線程中的循環佔用所有的CPU,所以我不能讓它繼續運行,儘管這給了我很好的性能。如何創建阻塞函數

據我所知,這個任務是讓消費線程等待一些信號,表明生產線程提供了一些東西來分派(?),但如何最好地做到這一點?如果我想讓兩個線程互斥,我想我需要兩個互斥體;消費者等待生產者,生產者一旦消費者恢復運行就會繼續生產。到目前爲止還沒有真正做到這一點,我真的不知道如何做到最好。 CriticalSections vs. mutexes,完全不同的東西?

我不想從生產者線程調用SendInput的原因是該線程('主線程')實際運行時響應鼠標移動消息,被鼠標鉤截獲,併發送更多鼠標來自該線程的消息不允許線程在模擬的鼠標移動事件處理之前芬蘭語,爲我弄亂了事情。正如我懷疑的那樣,將SendInput調用移動到另一個線程,以便原始線程可以完成解決問題的方式,但現在我需要使消費者響應更快;鼠標消息一直保持着良好的速度,因爲只有1ms的睡眠時間會使循環速度變慢,並且信息處理開始滯後;如果我沒有睡覺,一切都很好。

謝謝。

回答

2

聽起來像你想使用win32事件對象,而不是互斥或關鍵部分。請參閱文檔here。事件函數允許線程等待可以從另一個線程發送信號的條件。

+0

謝謝。我們會仔細研究它,以備將來參考,儘管看起來這次睡眠對我來說仍然適用;這是幾個cout打印輸出,當鼠標輸入被分派時,最終被執行,放慢執行:s – 72con 2010-08-17 17:13:20

1

Windows線程支持消息隊列 - 通常用於Windows消息,但完全可用於工作線程之間的消息傳遞。可以在Hook Proc中使用PostThreadMessage將消息發佈到另一個線程進行處理。

工作者線程可以做一個正常的GetMessage循環提取消息的過程 - 而不是將它們傳遞給DispatchMessage,你會在UI線程你只需檢查HWND是在表明它的線程消息的消息結構NULL,然後自己處理消息。在可能的消息氾濫的情況下,可以使用PeekMessage來從隊列中剔除任何未完成的消息。

+0

好的,這是很好的知道。但是,在我的情況下,我需要使用SendInput(我需要操作系統將光標移動到屏幕上),以便工作人員無法對從UI線程獲得的'消息'執行所有處理。它應該1)獲取座標,2)調用SendInput和3)當光標需要重新定位時,等待UI線程中的下一個座標。優選地,我想確保UI線程在調用SendInput之前甚至沒有完成處理原始鼠標移動消息。 這是模擬遊標,每次移動實際遊標時總是應該放回。 – 72con 2010-08-20 09:17:33

+0

還有一個問題,如果有人可以向我解釋這一點;以前我有UI線程調用SendInput時,有一個鼠標移動消息和光標需要重新定位在屏幕上。現在我不禁要問自己,爲什麼這不會導致僵局;兩個消息都得到了處理(遞歸)。不從UI線程調用SendInput確切地說應該保證暫停? – 72con 2010-08-20 09:18:12