VBVBA中的DoEvents,除了字面功能,還做了啥好事?

前言

VB/VBA中的DoEvents,除了字面功能,還做了啥好事?

這是電腦程式沒排上回家的隊,迷路了

無論編不程式設計,誰沒見過電腦卡死不是。正如古人說得好,常在河邊走哪有不溼鞋,誰還沒有迷路找不到道的時候,是不!俗話說,浪子回頭金不換,有些人給點時間,準能上岸。但電腦畢竟不是人啊,一旦卡起,不響應滑鼠鍵盤,友誼的小船不翻也得給翻了去。

倘若不問個為什麼,給了時間,可不是糟蹋電嘛。這不,《VB/VBA程式假死,長時間不響應的原因有哪些?》一出,有人不服了。

“資料量大了,啥語言都得卡死”,這聽上去讓人覺著就該卡一樣。當然也有人說,為啥不多執行緒?可是,也不是什麼問題都可以用多執行緒來解決的。更何況VB/VBA裡的多執行緒,藏的夠好,一般人很難摸到竅門。

那是不是就沒有辦法了呢?或者說VB/VBA就沒有辦法了呢?那肯定不是。有網友說,用DoEvents放棄控制權不就完事了,可真的是這樣嗎?那本文將帶各位一探DoEvents的究竟,Follow Me!

一、看看官方文件中的DoEvents

VB/VBA中的DoEvents,除了字面功能,還做了啥好事?

還別說,就是放棄控制權!網友勝!

DoEvents這個函式,一般大家也找不到機會用,即便是在迴圈中。也只有呼叫那些無法控制的程式碼時,才有機會。比如啟用另外一個EXE去執行某個任務,才會有人想用1個近乎空轉的迴圈來等待任務的結果。為了不卡,才會想到DoEvents。

你別說,

用了DoEvents,不但不卡,CPU的佔用也不會飆升,堪稱VB/VBA中不卡神器。

但是,大家有沒有想過,

既然DoEvents是來放棄控制權的,CPU都不為之所用,那誰來幹活呢?不幹活當然就不卡嘛

,這不卡,豈不是掩耳盜鈴,自欺欺人嘛。還有,這種不卡,會不會進一步增加資料處理的時間呢?

二、BtOfficer眼中的DoEvents

VB/VBA中的DoEvents,除了字面功能,還做了啥好事?

誰說是放棄控制權的,明明是爭奪好不?

在《VB/VBA程式假死,長時間不響應的原因有哪些?》中,給大家介紹了Windows系統CPU資源調配的原理,如果是放棄控制權,就意味著重新排隊,很顯然是會增加耗時的。但有心的網友,肯定會發現,使用DoEvents不但不會顯著增加時耗,反而會提升效率。

這是為何呢?還得回到DoEvents的功能上來,那就是放棄控制權。

只不過,此放棄非彼放棄,此放棄是為了爭奪,是以退為進。

是不是很難理解?原因其實就是上圖中的“Sleep一下下”啦。

三、Sleep跟DoEvents有啥關係?為何不放反爭,不退反進?

VB/VBA中的DoEvents,除了字面功能,還做了啥好事?

Sleep,做,不如不做。。。

如果跟一下VB/VBA的DoEvents的實現,會赫然發現,這貨居然在呼叫Sleep函式。是不是更迷糊了?Sleep不是不幹事麼!難道做不如不做,有理了?那以後想讓程式碼摸魚,豈不是越Sleep,越幹得歡快?

想想,天下武功唯快不破,閃電俠跑得足夠快,時間都能慢下來。如果眼皮兒眨得夠快,不就相當於沒有眨了嘛。但究竟眨沒呢,顯然是眨了的。同樣,對於Sleep函式來說,

Sleep 0,不就相當於沒有Sleep了嘛

。說好的放棄控制權呢?騙騙系統罷了。

沒錯,DoEvents就是透過Sleep 0來欺騙系統,它只是通知系統趕快把佇列裡的其他活兒排上,別誤了大事兒。系統一聽,好傢伙,孔融讓李啊,怎麼忍心懲罰呢(降低優先順序)。便去吼一嗓子,讓隊伍動一動,免得有人焦躁。哎,其他人都動了下,不卡了吧。

接著系統說,領狗糧了,下一個!那個DoEvents的傢伙笑眯眯地伸出雙爪,系統一看,怎麼還是你?DoEvents說,為什麼不是我,都是按規矩來的,趕緊!系統恨得牙癢癢,自知是生來的錯,只得唸唸有詞:下個版本,下個版本,等著啊。。。

歡迎關注BtOfficer,誰說VB/VBA不能屎上雕花!