Qt之定時(shí)器

定時(shí)器的作用在Qt開(kāi)發(fā)中老虫,應(yīng)用場(chǎng)景比較豐富譬巫,比如輪詢(xún)定時(shí)任務(wù)、模擬進(jìn)度條、延時(shí)動(dòng)畫(huà)展示伞剑、計(jì)算時(shí)間間隔等等。但在實(shí)際的開(kāi)發(fā)中濒生,定時(shí)器常常是非必要不使用的原則见秤。了解定時(shí)器的實(shí)現(xiàn)原理,可以更好的判斷在不同應(yīng)用場(chǎng)景下定時(shí)器的使用
1.定時(shí)器時(shí)間精度依賴(lài)于系統(tǒng)的硬件
定時(shí)器的精度依賴(lài)于系統(tǒng)硬件1ms的定時(shí)精度遂蛀,同時(shí)在系統(tǒng)忙碌的情況下無(wú)法確保準(zhǔn)時(shí)觸發(fā)timeout谭跨。因此在某些場(chǎng)景下,依賴(lài)前置條件需要延時(shí)初始化或延時(shí)調(diào)用函數(shù)李滴,通過(guò)定時(shí)器延時(shí)觸發(fā)初始化螃宙,延時(shí)時(shí)間的設(shè)置與timeout的觸發(fā)依賴(lài)于硬件性能(部分系統(tǒng)還會(huì)限制定時(shí)器的數(shù)量),不同機(jī)器表現(xiàn)會(huì)有所不同所坯,不能確切保證程序的先后執(zhí)行情況谆扎。
2.定時(shí)器的實(shí)現(xiàn)原理
Qt定時(shí)器的使用依賴(lài)于當(dāng)前線程的事件循環(huán)調(diào)度,在事件循環(huán)中芹助,監(jiān)聽(tīng)系統(tǒng)消息隊(duì)列中的WM_TIMER事件燕酷,并翻譯成QEvent::Timer發(fā)送給接收對(duì)象,實(shí)現(xiàn)定時(shí)器的超時(shí)周瞎。

int timerId = d->threadData->eventDispatcher.load()->registerTimer(interval, timerType, this);

向系統(tǒng)注冊(cè)定時(shí)器事件QEventDispatcherWin32::registerTimer

在 Windows 操作系統(tǒng)中苗缩,注冊(cè)定時(shí)器的底層原理涉及到操作系統(tǒng)內(nèi)核、計(jì)時(shí)器機(jī)制声诸、以及消息傳遞系統(tǒng)酱讶。下面是一個(gè)簡(jiǎn)要的概述,說(shuō)明在 Windows 中注冊(cè)定時(shí)器的底層原理:
1.定時(shí)器對(duì)象創(chuàng)建
2.插入定時(shí)器隊(duì)列:
系統(tǒng)會(huì)將新創(chuàng)建的定時(shí)器對(duì)象插入到一個(gè)全局定時(shí)器隊(duì)列中彼乌。這個(gè)隊(duì)列通常是一個(gè)基于時(shí)間的優(yōu)先級(jí)隊(duì)列泻肯,以便高效地管理多個(gè)定時(shí)器渊迁。
3.系統(tǒng)時(shí)鐘管理:
操作系統(tǒng)維護(hù)一個(gè)全局的系統(tǒng)時(shí)鐘,用于跟蹤系統(tǒng)的當(dāng)前時(shí)間灶挟。當(dāng)一個(gè)新的定時(shí)器被添加到定時(shí)器隊(duì)列中時(shí)琉朽,系統(tǒng)會(huì)根據(jù)定時(shí)器的超時(shí)間隔計(jì)算出定時(shí)器的到期時(shí)間,并將其與當(dāng)前系統(tǒng)時(shí)間進(jìn)行比較稚铣。
4.系統(tǒng)時(shí)鐘滴答:
操作系統(tǒng)內(nèi)核有一個(gè)硬件時(shí)鐘(通常是系統(tǒng)的計(jì)時(shí)器中斷)箱叁,定期(通常是每隔幾毫秒)觸發(fā)一個(gè)中斷。這些中斷用于更新系統(tǒng)時(shí)鐘惕医,并檢查定時(shí)器隊(duì)列中是否有任何定時(shí)器已經(jīng)到期耕漱。
5.檢查定時(shí)器隊(duì)列:
每次系統(tǒng)時(shí)鐘中斷觸發(fā)時(shí),操作系統(tǒng)會(huì)檢查定時(shí)器隊(duì)列抬伺,查看是否有任何定時(shí)器已經(jīng)到期螟够。如果發(fā)現(xiàn)一個(gè)或多個(gè)定時(shí)器到期,系統(tǒng)會(huì)將這些定時(shí)器的到期事件插入到相應(yīng)線程或窗口的消息隊(duì)列中峡钓。
6.消息處理:
當(dāng)一個(gè)定時(shí)器事件被插入到消息隊(duì)列中時(shí)妓笙,目標(biāo)窗口或線程的消息循環(huán)會(huì)處理這個(gè)事件。通常能岩,這涉及到向窗口過(guò)程(Window Procedure)發(fā)送一個(gè) WM_TIMER 消息给郊。
7.定時(shí)器的銷(xiāo)毀
當(dāng)調(diào)用 KillTimer 函數(shù)時(shí),操作系統(tǒng)會(huì)從定時(shí)器隊(duì)列中移除指定的定時(shí)器對(duì)象捧灰,并取消其與窗口或線程的關(guān)聯(lián)淆九。

定時(shí)器的使用是向系統(tǒng)注冊(cè)定時(shí)器,系統(tǒng)判斷超時(shí)會(huì)通知定時(shí)器關(guān)聯(lián)的窗口函數(shù)進(jìn)行響應(yīng)毛俏,因此炭庙,在桌面應(yīng)用程序開(kāi)發(fā)過(guò)程中,如果非必要地使用了定時(shí)器煌寇,軟件處于在用戶計(jì)算機(jī)待機(jī)的情況下焕蹄,會(huì)定時(shí)觸發(fā)timeout,調(diào)用應(yīng)用程序阀溶,造成待機(jī)耗電影響腻脏。

在多線程應(yīng)用程序中,您可以在任何具有事件循環(huán)的線程中使用QTimer银锻。要從非gui線程啟動(dòng)事件循環(huán)永品,請(qǐng)使用QThread::exec()。Qt使用定時(shí)器的線程關(guān)聯(lián)來(lái)確定哪個(gè)線程將發(fā)出timeout()信號(hào)击纬。因此鼎姐,必須在其線程中啟動(dòng)和停止計(jì)時(shí)器;不可能從另一個(gè)線程啟動(dòng)計(jì)時(shí)器。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市炕桨,隨后出現(xiàn)的幾起案子饭尝,更是在濱河造成了極大的恐慌,老刑警劉巖献宫,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钥平,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡姊途,警方通過(guò)查閱死者的電腦和手機(jī)涉瘾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吭净,“玉大人,你說(shuō)我怎么就攤上這事肴甸〖叛常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵原在,是天一觀的道長(zhǎng)友扰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)庶柿,這世上最難降的妖魔是什么村怪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮浮庐,結(jié)果婚禮上甚负,老公的妹妹穿的比我還像新娘。我一直安慰自己审残,他們只是感情好梭域,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著搅轿,像睡著了一般病涨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上璧坟,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天既穆,我揣著相機(jī)與錄音,去河邊找鬼雀鹃。 笑死幻工,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的黎茎。 我是一名探鬼主播会钝,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了迁酸?” 一聲冷哼從身側(cè)響起先鱼,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奸鬓,沒(méi)想到半個(gè)月后焙畔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡串远,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年宏多,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澡罚。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伸但,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出留搔,到底是詐尸還是另有隱情更胖,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布隔显,位于F島的核電站却妨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏括眠。R本人自食惡果不足惜彪标,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掷豺。 院中可真熱鬧捞烟,春花似錦、人聲如沸当船。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)生年。三九已至婴程,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抱婉,已是汗流浹背档叔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒸绩,地道東北人衙四。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像患亿,于是被迫代替她去往敵國(guó)和親传蹈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子押逼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容