自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么單擊并按住標(biāo)題欄,程序運行得更快?

商務(wù)辦公
當(dāng)你在標(biāo)題欄上單擊并按住鼠標(biāo)時,窗口管理器會等待下一條鼠標(biāo)消息,以便它可以確定你是單擊標(biāo)題還是嘗試拖動。在等待期間,窗口的繪制工作將暫時停止。

有時候,人們會發(fā)現(xiàn)這樣一個怪異現(xiàn)象:如果在執(zhí)行一項長時間運行的任務(wù)的時候,在標(biāo)題欄按下鼠標(biāo),這個時候,會發(fā)現(xiàn)程序運行的更快了一些。

這件奇怪的事情通常是發(fā)生在這樣一種場景:當(dāng)程序花費太多時間更新其進(jìn)度狀態(tài)而沒有足夠的時間用來做實際的計算工作。(換句話說,程序員搞砸了。)

當(dāng)你在標(biāo)題欄上單擊并按住鼠標(biāo)時,窗口管理器會等待下一條鼠標(biāo)消息,以便它可以確定你是單擊標(biāo)題還是嘗試拖動。在等待期間,窗口的繪制工作將暫時停止。這就是為什么程序運行得更快的原因:沒有窗口繪畫意味著花在更新上的 CPU 會減少,而無論如何更新都比讀取更快。讓我們通過一個簡單的例子程序來演示這個現(xiàn)象。

這個程序啟動了一個后臺線程,它計數(shù)到 100000,并且每次數(shù)值改變時都會使前臺窗口無效。運行它,看數(shù)字加到 100000會有多快。(當(dāng)循環(huán)結(jié)束時,我添加了一個小聲音提示,所以你可以通過聽聲音提示來判斷時間。)

現(xiàn)在再次運行它,但這一次,單擊并按住標(biāo)題欄上的鼠標(biāo)。請注意,程序幾乎立即發(fā)出聲音提示:當(dāng)你按住鼠標(biāo)時,它運行得更快。這是因為所有繪畫都被單擊并按住標(biāo)題時觸發(fā)的可能拖動操作正在進(jìn)行中抑制。

每次增加就更新屏幕顯然是無意義的,因為增加得速度遠(yuǎn)遠(yuǎn)快于屏幕刷新速度,更不用說人眼讀取速度。根據(jù)經(jīng)驗,每秒改變進(jìn)度狀態(tài)超過 10 次通常是無意義的。你在屏幕更新上付出的努力都白白浪費了。

讓我們修改一下示例程序,使其每秒最多更新十次。我們將以 100ms 為間隔運行計時器,檢查是否有任何更改,并重新繪制屏幕。

我們不是在每次計數(shù)器改變值時就更新屏幕,而是僅僅設(shè)置一個”嘿,有些東西改變了”的標(biāo)志,并在計時器上檢查它。我們在生產(chǎn)者線程中使用釋放語義來設(shè)置標(biāo)志(因為我們希望在交換發(fā)生之前完成所有掛起的存儲操作)并使用獲取語義在消費者線程中清除標(biāo)志(因為我們不希望將來任何的存儲操作都被推測在交換之前)。

再次運行該程序,注意它瞬間計數(shù)直到 100000。當(dāng)然,這并不能真正演示進(jìn)度計數(shù)器,因此將 Sleep(1) 插入循環(huán)中:

這足以使循環(huán)的速度變慢,因而可以看見遞增的值。并不是像在最初版本中看見的令人眼花繚亂的遞增,但是足以使人們領(lǐng)會其含義。

我用于在后臺和前臺線程之間傳遞信息的機制假定后臺更新相對頻繁,這樣計時器幾乎總會發(fā)現(xiàn)一些值得做的事情。如果混合執(zhí)行一些快速和慢速任務(wù),可以修改通信機制,這樣當(dāng)注意到一段時間沒有更新時,計時器將自行關(guān)閉。后臺線程恢復(fù)更新值時需要重新啟動計時器。我沒有費心編寫這種更復(fù)雜的版本,因為這只會分散文章的要點。

總結(jié)

我曾經(jīng)也想過將程序的每次狀態(tài)變更都呈現(xiàn)在用戶界面上,覺得這可以讓用戶了解程序的實時運行狀態(tài)。但是在后來的實際體驗中,我感覺這并不是想象中那樣美好。從用戶的角度來說,他/她所希望的事情是:趕緊幫我把活兒做完,別成天整這些花里胡哨的東西。

確實如此!畢竟大家都這么忙。

最后

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,里面有很多關(guān)于Windows的小知識,對于廣大Windows平臺開發(fā)者來說,確實十分有幫助。本文來自:《Why does my program run faster if I click and hold the caption bar?》

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2023-09-20 00:06:30

Python代碼函數(shù)

2017-02-13 17:17:48

Android標(biāo)題欄控件

2012-09-11 09:16:52

Hadoop

2011-02-22 14:53:41

titlebar標(biāo)題欄Android

2015-08-14 17:47:35

Windows 10標(biāo)題欄

2009-11-03 18:05:00

VB.NET窗體標(biāo)題欄

2022-06-22 10:33:06

麻省理工大學(xué)PaShUnix shell

2024-10-08 10:24:41

Python編程語言

2020-09-04 15:03:18

Python代碼語言

2017-05-03 16:30:38

AndroidScrollView滾動視圖

2011-05-04 10:40:02

網(wǎng)頁加載進(jìn)度標(biāo)題欄lephone

2021-12-14 12:10:41

ChromeWindows瀏覽器

2021-06-03 05:08:19

Edge微軟瀏覽器

2024-06-26 10:50:35

2022-02-13 19:05:19

微軟Windows 11

2019-03-29 09:00:11

Windows 10PC模擬器

2021-09-01 13:53:19

WindowsAcrylic標(biāo)題欄

2021-04-23 15:20:54

微軟瀏覽器Windows

2021-01-13 10:51:08

PromissetTimeout(函數(shù)

2013-12-19 14:16:46

Android ApiAndroid開發(fā)Android SDK
點贊
收藏

51CTO技術(shù)棧公眾號