簡體   English   中英

使用SendMessage()多線程

[英]Using SendMessage() Multi-threaded

如果我使用從不同線程到一個接收者的SendMessage()會怎樣? 設想一種情況,當接收方仍在處理來自Thread1的消息,而Thread2發送另一條消息時(使用SendMessage())。 接收端會發生什么? 它是否停止執行Message1,處理Message2,並在完成Message2之后返回到Message1? 還是Message2等待Message1結束?

基本規則是:線程調度跨線程發送的消息的唯一時間是在該線程上調用消息檢索功能( GetMessagePeekMessage等)時。 消息檢索功能首先檢查是否有任何跨線程發送的消息,一個接一個地分派,然后繼續從線程的消息隊列中檢索消息。

這有2個后果:

  • 當接收線程不處理1)任何排隊的消息時,將調度跨線程發送的消息。
  • 當接收線程未處理時,將調度跨線程發送的消息1)任何其他跨線程發送的消息。

在您的特定示例中,接收方將繼續處理Message1,直到完成為止,然后在下一次調用消息檢索功能時繼續發送Message2。

此規則有一個明顯的例外:等待SendMessage返回的線程可以調度入站跨線程發送的消息2) 這意味着存在重新進入的可能性。 再次以您的示例為例,假設Message1的消息處理程序有時會調用SendMessage ,很可能是在繼續處理Message1之前分派了Message2。

把它們加起來:

  • 跨線程發送的消息在接收線程上串行調度。
  • 線程分派跨線程發送的消息時,有幾個明確定義的時間。
  • 雖然從不並發處理跨線程發送的消息,但是沒有原子性規則。 准備重新進入。


1)假設調用消息檢索功能不是正常消息處理的一部分。
2)請參閱線程何時可以接收窗口消息? 有關為何會出現這種情況的詳細信息。

我將假設問題是有關發送到特定窗口(即NULL或HWND_BROADCAST以外的HWND)的消息的,並且該窗口由屬於同一進程的線程擁有。

在這種情況下,下次使用包含給定窗口的過濾器調用GetMessage時,創建目標窗口的線程將收到消息。 發送線程將被阻塞,直到接收線程實際完成對消息的處理為止。

如果在處理來自Thread1的消息時,接收線程再次調用GetMessage / DispatchMessage,那么此時將處理任何待處理的消息(包括Thread2可能發送的消息),然后控制權將返回到處理來自Thread1的消息。

從文檔的SendMessage函數

如果指定的窗口是由調用線程創建的,則該窗口過程將作為子例程立即被調用。 如果指定的窗口是由其他線程創建的,則系統切換到該線程並調用適當的窗口過程。 僅當接收線程執行消息檢索代碼時,才處理線程之間發送的消息。 發送線程被阻塞,直到接收線程處理該消息為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM