多線程是用于處理復(fù)雜項目的
創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計制作、成都做網(wǎng)站與策劃設(shè)計,賓陽網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:賓陽等地區(qū)。賓陽做網(wǎng)站價格咨詢:18980820575
打個比方
你的主程序線程A中有個循環(huán),由于代碼是一行行走的,所以循環(huán)結(jié)束前下面的代碼無法運行,而此時主界面的反應(yīng)就類似卡死的樣子,你點擊按鈕也沒有反應(yīng),因為主線程在忙著循環(huán)呢,所以對按鈕的事件代碼要等待了,如果要避免這種情況,就要用到多線程,另開一個新線程專門用來執(zhí)行循環(huán)代碼,主界面就不會卡死了,只要在循環(huán)結(jié)束后將結(jié)果傳回主線程調(diào)用就可以了,再復(fù)雜點要涉及到委托,控制了
按你的要求其實你的代碼用不到多線程,只要把sleep放到兩段代碼中間就可以了。
新線程結(jié)束用thread.abort()
如果需要等待T2線程結(jié)束,那又何必開啟這個線程!!
直接:
Label1.Visible = True
setB()
MsgBox("d")
這不就是執(zhí)行完setB(),再執(zhí)行MsgBox("d"),多線程是多余的。
多線程的作用大多數(shù)也就用來同時執(zhí)行多任務(wù)而不用等待的。
用time控件啊,獲取threadstate后,按指定時間間隔規(guī)定向界面刷新,線程必須是全局變量
用一個有退出條件的無限循環(huán)的sub也行。
線程開始就觸發(fā)該過程,用無限循環(huán)來刷新狀態(tài),線程完成即退出無限循環(huán)。局部變量的線程也可以用這種方式。
不過用法要正確,否則會出問題。
你可以在timer前用if判斷網(wǎng)絡(luò)狀態(tài),
如斷開,可用
threading.Thread.Sleep(10000) ‘當(dāng)前線程掛起10秒
’可以開一個新線程去讀取脫機數(shù)據(jù)。
如連接,則繼續(xù)執(zhí)行。
補充:
dim i as integer
'超過100次退出,避免死循環(huán)
for i=0 to 100
try
'ping你的端口
if ‘ok
exit for
else
threading.Thread.Sleep(10000) ‘當(dāng)前線程掛起10秒
end
Catch ex As Exception
End Try
next
使用api
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
我告訴你思路,你自己去實現(xiàn)。
建議你用“守護線程”的方式去做,這樣做對于你一個小任務(wù)來說更合適。首先,你要建立一個隊列,將所有下載任務(wù)放入隊列。注意,這個隊列必須是“線程安全”的,即兩個線程不會搶到同一個任務(wù)。然后只開10個線程。這些線程會從隊列中讀取任務(wù)。當(dāng)一個線程不能再從隊列中讀取任務(wù)時,也就是隊列為空時,退出。等所有線程都退出后,你的程序就結(jié)束了。
還有一種方法,叫“線程池”,也就是你說的方法,稍微復(fù)雜一點:
指定一個變量,用來表示線程的數(shù)量。剛開始為0,每開一個線程+1。當(dāng)一個線程完成任務(wù)退出后,這個變量-1。直到所有任務(wù)都完成后,不再產(chǎn)生新線程。