国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

巧用Timer定時器解決VB中循環(huán)造成的假死現(xiàn)象

2018-01-22 01:48:40何偉
電腦與電信 2017年11期
關(guān)鍵詞:進度條命令行程序運行

何偉

(甘肅省天水市職業(yè)技術(shù)學(xué)校,甘肅 天水 741000)

1 引言

在使用VB語言編程過程中,如果遇到循環(huán)次數(shù)過多的循環(huán)命令或循環(huán)的嵌套層次較多時,很容易出現(xiàn)假死甚至假死機現(xiàn)象,而且循環(huán)執(zhí)行的過程中用戶無法進行中斷。隨著操作系統(tǒng)的不斷完善,現(xiàn)在這種情況變成了“程序未響應(yīng)”現(xiàn)象。在循環(huán)體中,如果加入一個進度條顯示命令,也根本看不到進度的顯示,想停下來,各種命令按鈕也不再起作用。隨著社會的發(fā)展需求,我們對軟件的要求并不是短小精悍,而是更加注重人性化操作。例如有一段命令需要執(zhí)行1萬次,在執(zhí)行的過程中應(yīng)該能隨時了解運行的情況,而且隨時可以終止或暫停,尤其是在程序執(zhí)行過程中,CPU占用資源要盡量少,不影響其他軟件的工作,這樣一來,再復(fù)雜的程序我們都可耐心等待。如果程序能自動根據(jù)計算機的實際配置調(diào)整計算機CPU的占用率,那就再好不過了。經(jīng)過本人長期的摸索探討,終于找到一個較好的解決辦法:利用Timer定時器控件能設(shè)定循環(huán)的時間,再根據(jù)自己需求設(shè)定參數(shù)可更改循環(huán)數(shù)值,我們剛好利用它的這一獨特性來巧妙解決問題。

2 問題的提出

我們在利用高級語言程序進行編程過程中,在處理具有相同的、有規(guī)律性的重復(fù)操作時,簡潔的辦法都會使用循環(huán)語句來處理。

用一個簡單的程序來說明如下:

例如,計算s=1+2+3+……+n

如果程序要求從1加至100,這個程序則很簡單,使用循環(huán)語句命令如下:

這個程序命令很簡單,就是從1加到100,循環(huán)重復(fù)執(zhí)行S=S+i語句100次,就求出了結(jié)果。這個程序初學(xué)者也能輕松掌握和理解,這個程序經(jīng)常作為初學(xué)者的教學(xué)累加實例。

但理論和實際往往有一定的差別,以FOR循環(huán)命令為例,編程命令在使用過程中,如果遇到大的循環(huán)命令或循環(huán)的嵌套,很容易出現(xiàn)假死甚至死機現(xiàn)象,而且循環(huán)執(zhí)行的過程中用戶無法中斷。在進度條和很多軟件中的也不同,經(jīng)常只顯示第一步和最后一步,中間的過程并不顯示。例如我們?nèi)绻嬎銖?加到100萬或者從1加到100億,這段程序的執(zhí)行就變得完全不同,即便配置和運算速度高的計算機,隨著運算次數(shù)的越來越多,運算數(shù)據(jù)的不斷增加,當(dāng)達到機子運算極限時,就會出現(xiàn)假死或死機現(xiàn)象。

3 初步解決方案

那么我們?nèi)绾谓鉀Q這個問題呢?經(jīng)過本人多次長期的摸索探討,終于找到一個較好的解決辦法,那就是利用VB中的Timer定時器控件。我們知道Timer定時器控件功能是在指定的時間間隔內(nèi)反復(fù)觸發(fā)指定窗口的定時器事件,我們可以看到這個控件的功能和循環(huán)語句是多么的相像,唯一不同點就是這個控件能設(shè)定循環(huán)的時間,所以我們剛好利用它的這一獨特的特性來解決問題。

我們現(xiàn)在重新編寫上段程序,步驟如下:

(1)添加控件:(為了使程序方便大家閱讀,控件都使用默認(rèn)名稱)

定時器Timer1放入循環(huán)體,初始要設(shè)置成禁用,即Enabled項為False

按鈕 Command1'用于控制程序的“開始”和“繼續(xù)”

按鈕 Command2'用于控制程序的“暫?!?/p>

進度條ProgressBar1'用于顯示和查看程序運行進度

文本框Text1 '用于顯示i的當(dāng)前值

文本框Text2 '用于顯示S的當(dāng)前值

(2)添加代碼:

Dim i as Double'用于控制循環(huán)運行次數(shù),由于數(shù)據(jù)量大,就定義成雙精度

Dim SAs Double'用于計算和值

Private Sub Form_Load()'程序初始,定義一些控件的初始值

i=0'初始循環(huán)的次數(shù)

S=0'初始和值

Timer1.Interval=10 '設(shè)置定時器的運行速度,單位毫秒,目前為10毫秒

ProgressBar1.Max=10000'定義進度條的最大值

ProgressBar1.Value=0'初始進度條進度,當(dāng)前為0

End Sub

Private Sub Command1_Click()

Timer1.Enabled=True'只需讓定時器工作,循環(huán)就開始

End Sub

Private Sub Timer1_Timer() '計時器控件、放置循環(huán)體

i=i+1

If計數(shù)<=10000 then

S=S+i

ProgressBar1.Value=i'顯示當(dāng)前進度

Text1.text=i'顯示 i的當(dāng)前值

Text2.text=S'顯示S的當(dāng)前值

Else

Timer1.Enabled=False'循環(huán)結(jié)束

End If

End Sub

Private Sub Command2_Click()'控制循環(huán)結(jié)束或暫停按鈕

Timer1.Enabled=False'定時器停止,循環(huán)結(jié)束

End Sub

程序執(zhí)行主要過程是,兩個按鈕的作用只是控制定時器的“啟用”和“禁用”,定時器內(nèi)部的IF語句控制程序是否結(jié)束,兩個文本框,一個顯示i值,一個顯示S值,配合進度條讓程序的執(zhí)行不顯得單調(diào),用戶可以很容易判斷出,程序還需執(zhí)行多少時間。經(jīng)過改編程序后,其優(yōu)點是:在目前的情況下,不論多么配置低檔的計算機,都能平穩(wěn)地運行代碼,而且隨時可以暫?;蛲V梗M度條也真正開始顯示實際進度。但缺點是:顯而易見,命令多了很多,也復(fù)雜了很多,如果一個軟件中出現(xiàn)諸多的循環(huán)體,命令行要增加許多倍。而且,資源的消耗雖然變小了,但運行的時間增加了幾百倍。

4 優(yōu)化解決方案

所以程序至此,雖然解決了主要問題,但還有不少缺點,需要我們進一步分析解決:

仔細(xì)深入分析,問題一,程序運行時間過長。直接使用For循環(huán),大循環(huán)容易造成資源消耗過大,導(dǎo)致死機現(xiàn)象。而使用Timer控件,則出現(xiàn)資源浪費,運行時間過長。但我們?nèi)绻麑⑦@兩者巧妙結(jié)合,這個問題就迎刃而解了,所以我們得到了更好的解決方法,就是將Timer1內(nèi)部中所有的命令看成一個<命令行>,原程序可表示為:

Private Sub Timer1_Timer()

<命令行>

End Sub

這樣,控件Timer1每次只執(zhí)行一次<命令行>,運行穩(wěn)定,但資源浪費嚴(yán)重,速度較慢,所以我們進一步可將程序改寫如下:

Private Sub Timer1_Timer()

for j=1 to 500'每次執(zhí)行500次

<命令行>

next j

End Sub

根據(jù)自己需求或計算機配置可更改循環(huán)數(shù)值,這樣一來,兩者兼?zhèn)?,程序運行既平穩(wěn),速度也不慢。這樣我們就很好地解決了第一個問題。

存在的第二個問題是:循環(huán)命令多,程序變得復(fù)雜。

經(jīng)過改進的程序中用到100個循環(huán),按最初的設(shè)計我們需要添加100個Timer控件,這樣程序變得更加龐大而且顯得笨拙。經(jīng)過探究思索,我們僅僅需要利用一個選擇語句Select,就可巧妙地解決問題。

程序改寫如下:

先定義一個變量K,由按鈕或命令控制其數(shù)據(jù)。

Private Sub Timer1_Timer() '計時器控件、放置循環(huán)體

Select case K 'K為循環(huán)控制參數(shù)

Case 0

<循環(huán)體1>

Case 1

<循環(huán)體2>

……

End Select

End Sub

我們現(xiàn)在看到,循環(huán)增加了很多,但命令并不是成倍增長,增加量并不多。如果還覺得程序體太長,不宜編寫和調(diào)試,還可使用函數(shù),再次進行修改如下:

Private Sub Timer1_Timer() '計時器控件、放置循環(huán)體

Select case K 'K為循環(huán)控制參數(shù)

Case 0:Call自定義函數(shù)A

Case 1:Call自定義函數(shù)B

……

End Select

End Sub這樣我們就很好地解決了第二個問題。

5 結(jié)語

至此,我們經(jīng)探究設(shè)計,終于找到一個較好的解決辦法,那就是利用VB中的Timer定時器控件,解決了直接使用For循環(huán),程序運行時間過長,容易造成資源消耗過大,導(dǎo)致死機的現(xiàn)象。而使用Timer控件,又會出現(xiàn)資源浪費。但我們?nèi)绻麑⑦@兩者結(jié)合,就是將Timer1內(nèi)部中所有的命令看成一個<命令行>,這個問題就迎刃而解了,進一步我們利用一個選擇語句Select和函數(shù),就很巧妙地解決了以上問題。

[1]趙曉麗.基于S p r i n g的定時器的應(yīng)用實現(xiàn)[J].太原師范學(xué)院學(xué)報:自然科學(xué)版,2015(4):48-53.

[2]任君玉,黎國文.網(wǎng)絡(luò)中的定時器技術(shù)[J].電腦知識與技術(shù):學(xué)術(shù)交流,2011(7 X):5094-5095.

[3]侯婷.淺談V B F OR循環(huán)嵌套的運行機制[J].教育教學(xué)論壇,2012(9):169-180.

猜你喜歡
進度條命令行程序運行
進度條是假的
為什么進度條到99%就不動了
旗幟文摘(2020年5期)2020-06-09 12:20:12
為什么進度條到99%就不動了
意林(2020年10期)2020-06-01 07:26:37
為什么進度條到99%就不動了
知識窗(2020年3期)2020-04-02 07:08:28
行政公益訴訟訴前程序運行檢視
法大研究生(2020年2期)2020-01-19 01:43:04
Windows 10新版CMD更新
Linux系統(tǒng)下GRIB2格式GFS資料轉(zhuǎn)為GRIB1格式的方法詳解
論刑事錯案的成因
《刑事訴訟法》修改背景下刑事和解制度淺析
低碳生活,從命令行開始
桂林市| 平谷区| 德安县| 如东县| 盈江县| 莱芜市| 清原| 兴宁市| 汽车| 太和县| 将乐县| 于都县| 秦安县| 大化| 台湾省| 朝阳县| 肥城市| 漳浦县| 化隆| 崇左市| 南丰县| 萍乡市| 油尖旺区| 富宁县| 五莲县| 湟中县| 张家港市| 临泽县| 宁城县| 桓仁| 荥阳市| 贵南县| 屯留县| 应城市| 澄江县| 沙雅县| 福海县| 乐都县| 惠来县| 临颍县| 利津县|