消失的線程消息

漫漫開發路 發佈 2022-09-29T02:32:43.418326+00:00

在上一篇文章中,我們介紹到,模態消息循環會吃掉線程消息。今天的文章中,我們將會演示這個場景,並在將來的文章中嘗試修復這個問題。還是基於我們的例子程序,然後做一些修改,如下圖所示:試著運行這個修改後的例子程序,你會發現,它會每隔2秒鐘發出蜂鳴聲,至少大部分時間它是這樣的。

在上一篇文章中,我們介紹到,模態消息循環會吃掉線程消息。
今天的文章中,我們將會演示這個場景,並在將來的文章中嘗試修復這個問題。

還是基於我們的例子程序,然後做一些修改,如下圖所示:


試著運行這個修改後的例子程序,你會發現,它會每隔2秒鐘發出蜂鳴聲,至少大部分時間它是這樣的。
如果你右鍵單擊標題欄或抓住窗口邊緣開始調整大小或拖動滾動條或執行拖放擇或顯示消息框,則蜂鳴聲會停止。

那是因為,所有上面的操作都是模態操作,而模態消息循環正在吃掉線程消息。

保存這個程序,因為我們會回到它。

顯而易見的解決方案是,將消息發布到主窗口本身而不是線程。 因為你已經有了一個主窗口的句柄,為何不用它呢?

好了,這個問題解決了。我會試探另外一種玩法,就是以一種錯誤的方式來解決此問題,因為我想講講消息過濾器的主題。 下次吧。

總結

在Topomel Box中,我也用到了一些多線程方面的小技巧。這裡分享若干:
1. 工作線程絕對禁止直接操作用戶界面,如SetWindowText等。
2. 工作線程可以通過發送消息(同步或者異步的方式)給主線程,實現間接的操作用戶界面。
3. 對於完美主義者的來說,工作線程的退出必須是優雅的,儘可能使其」自然結束」,而不是」強制中止」。
4. 工作線程里分配的資源,在其自然結束前,必須主動釋放,否則程序長期運行下,會造成資源泄露甚至耗盡。

最後

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關於Windows的小知識,對於廣大Windows平台開發者來說,確實十分有幫助。
本文來自:《Watching thread messages disappear》

關鍵字: