軟體定時器是子線程么?
界面框架都會維護一個消息隊列,主線程接受的消息和定時器觸發的中斷消息會混在這裡面,輪到了才會觸發,所以應該是主線程是么,還是說各有不同,比如qt的和c#的mfc不一樣,
問題2 順便問一下在純c++里如果我有個子線程想調用主線程的回調應該如何做,能用消息投遞么,說幾個名詞我自己去查就行
如果你能直接受到消息的話,你只要找個窗口PostMessage一下就好了。不然,WinForms和WPF都會在Control類裡面給你一個把lambda表達式射進UI現成的方法,你手上拿著一個控制項就行。UWP比較複雜一點,每一個主窗口一個自己的線程,發給誰你得想清楚。
boost庫里有,線程,鎖,臨界區,事件模型,定時器,回調,非同步調用。
如果用mfc,有mfc類,可以直接調用win32 api。用c#,我是直接用隊列,在隊列上加個鎖,定時器執行,線程處理。qt,也有線程模型,互斥體模型,可用信號/槽機制通信。
很多問題只是生產者/消費者問題,加個臨界區同步與互斥好了。
定時器是時間片,運行時主線程會中斷,不適合處理時間長運算大的代碼,如網路通信。
線程,主要解決同步與互斥,信號通知,相互通信方式多,如redis,db,socket,http,rpc,管道,命名管道,信號,鎖,互斥體。
現在硬體和以前不一樣,你可以向chrome學習,用多進程框架,一個進程後台計算,一個進程界面顯示,進程通信用管道或本地socket,這樣不容易卡死,充分利用多核cpu。ie只要一個頁面卡死全死掉,chrome別的頁面不會受影響。感謝邀請。
首先,多線程和定時器不是一個概念層次。共同點,一是二者都是利用了CPU的分時分片,多CPU情況更複雜一些,但原理差不多;二是二者在windows平台上都常通過消息機制來通訊。
可以這樣理解,定時器一般的實現,是基於API的調用,有內核態和用戶態兩種,前者是操作系統級性能和精度更好,但不如用戶態調用方便。當定時器啟動後,在Windows平台,通過WM_TIMER消息發送。
而多線程,在單CPU分時分片情況下,其實是一個CPU上下文的切換,看起來就像並發。在多線程中,與主線程的通訊,有多種技術方案,比如管道、內存共享、IPC、消息…Windows下更多是採用消息機制。
題主可以了解一下消息隊列、消息循環、Run Loop、Event Loop 這幾個關鍵詞。
簡單來說,操作系統(或應用層 API)提供了一個機制,可以循環從一個隊列里取出消息,比如你的滑鼠移動了,那麼就會隊列尾就會塞入一個包含滑鼠事件的消息,那麼應用獲取到這個消息以後就可以做一些事情,比如把它派發給所有窗口啥的。假如這一時刻沒有任何可用的消息怎麼辦,肯定不能讓 CPU 空轉吧,所以消息隊列要進入睡眠狀態,蘇醒的條件是有消息產生或超時,那麼每次睡眠前根據 Timer 的優先隊列找出最近要觸發的定時器,將超時設為它觸發所需的時間就能實現定時器了。
當然這只是一種實現方式,實際情況會更複雜。
兩種,windows來說,一種是UI主線程上的一個消息,輪到觸發。一種是一個子線程在那跑著~
rtos的軟體定時器,是的,子線程。
1. 主線程是可以異部的, 如果框架是事件循環的模式, 定時器會直接在主線程上面註冊一個消息, 然後在一定的時間fire。 每個線程都有自己的事件循環, 所以每個線程的timer都是獨立的, 你需要將timer加到每個線程自己的runloop(如cocoa)。 當然, 多線程的方式做定時器也不是不可以, 只不過不太安全。2. 一個線程回調另一個線程的方式叫invoke. 不同線程會有自己的上下文, 所以貿然調用其他線程的函數會導致資源被額外開銷或者多重釋放, 導致一些奇怪的效果。 所以線程之間可以通過發消息的形式讓對方自己處理, 來迴避不必要的麻煩
問題1,主線程,子線程沒有區別,看哪個線程是處理消息的,就是發起讀消息系統調用,當然一般是主線程。問題2,調用是函數,函數不分線程。函數是不屬於任何線程的或者屬於任何線程。但有些東西只能在某個線程環境處理,比如更新界面,多個線程同時更新界面那屏幕就花了。這個時候就發一個消息給更新界面的線程。win編程來說自定義一個消息如何發送就好了。可以用同步或者非同步,具體看api吧。
不是,定時器函數會在調用線程插入一個apc調用,當時間到了會由系統觸發該apc事件,然後觸發apc中保存的用戶回調
消息循環中加一個定時器監測即可。不用子線程。
推薦閱讀:
※Qt程序冷啟動過慢如何解決?
※PC客戶端開發:目前有沒有封裝的比較好的類,可以比較快速和高效的實現QQ的氣泡聊天信息展示功能?
※QT獲取線程號函數currentThreadId()返回Qt::HANDLE 如何得到QString?
※qt窗口之間如何通信或信息共享?
※想學QT,是直接QT5還是先學QT4好?