7.20.2009

PostThreadMessage

雖然在Message Overview 里都只有說明有Windows 才有的Message/Queue 相關操作,但是從 PostThreadMessage ( ) 這個 function 來看,沒有Windows 的 Thread,也有 Message Queue。

但是有一些限制,Thread的 Message Queue不是在Thread 產生就Create好的,只有在Thread 有 call 過 Message 相關 funciton 後,才會產生。

同時,在Thread 的 Message Queue未產生之前,PostThreadMessage( )給他的話,Message會被丟掉 (同時 return FALSE)。

MSDN 提供兩個方法來避免這個問題:
  1. PostThreadMessage的人check return value,fail 的話就Sleep( )一段時間,等 對方把 MessageQueue 開出來
  2. 利用同步機制(Event) 來同步雙方的動作。 收Message的Thread 啟動時就call一次 PeekMessage( )同時指定不拿出message,
    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
    經過這次呼叫,Thread 的 MessageQueue 就會被 Create,然後用 SetEvent( )通知要PostThreadMessage給他的Thread。範例。
收Message的Thread 有三種收Message的Argument
  1. 收 Post 給 該 Thread 的 Window 的 Message
  2. 收 Post 給 該 Thread 的 Message
  3. 都收
1. 的話,要是有Windows 的Thread 才有效。

沒有留言: