Windows中子執行緒不能觸發定時器的問題分析

2021-06-18 00:41:48 字數 608 閱讀 5006

對視窗來說,都會有乙個訊息迴圈執行緒(此訊息執行緒即ui執行緒)執行各類任務,一般情況此執行緒大部分時間都處於空閒狀態,由訊息幫浦等待訊息觸發各類操作(如介面重新整理、定時器響應等),除非視窗退出,不然不會退出此執行緒。

在視窗執行緒或主線程中使用定時器由於有訊息幫浦等待定時器訊息,所以不會存在不響應定時器的情況。但子執行緒在建立時一般不需要訊息幫浦,所以按順序執行完後直接退出,就算是有定時器需要觸發,子執行緒也不知道,所以等定時器timeout時,並不會達到觸發的目的。

解決辦法

1、所有觸發定時器的操作轉到主線程執行

此方法是碰到此問題時首先想到的解決方法,也是簡單可行的,但某些情況可能就要改變定時器的觸發方式,在修改時會比較花時間。最關鍵的是:此方法是在逃避問題而不是迎接問題。

2、在子執行緒加入訊息幫浦

問題的本質也清楚了,那在子執行緒中加入訊息幫浦即可完美解決此類問題。需要在有觸發定時器的執行緒中加入peekmsg()函式(**如下),如果響應完後退出執行緒,直接在響應過程後退出while迴圈可以達到目的。

void peekmsg()}}

}

經驗證,以上方法是正確的,但需要根據實際問題進行一些調整完善。

MySQL 中子查詢是不能使用LIMIT

mysql5.1中子查詢是不能使用limit的,報錯 this version of mysql doesn t yetsupport limit in all any some subquery 這樣的語句是不能正確執行的。select from table where id in select ...

python中子類不能繼承父類的私有屬性和方法

在子類中是不能繼承私有屬性和方法的,但是私有屬性和方法可以在同乙個類中被呼叫 class person object def init self,name self.name name self.age 12 def greet self print hello,my name is s self....

Ubuntu不能訪問Windows分割槽

將windows的快速啟動關閉即可解決次問題。在電腦中安裝了雙系統,但有時候在ubuntu中訪問windows分割槽會出現如下錯誤 以前出現過這種錯誤,是因為windows系統沒有完全關閉,當時是使用的重啟選項從windows進入的ubuntu,所以再進入windows將windows關機之後問題解...