我告訴你思路,你自己去實現(xiàn)。
創(chuàng)新互聯(lián)主要從事做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)南溪,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
建議你用“守護(hù)線程”的方式去做,這樣做對于你一個小任務(wù)來說更合適。首先,你要建立一個隊列,將所有下載任務(wù)放入隊列。注意,這個隊列必須是“線程安全”的,即兩個線程不會搶到同一個任務(wù)。然后只開10個線程。這些線程會從隊列中讀取任務(wù)。當(dāng)一個線程不能再從隊列中讀取任務(wù)時,也就是隊列為空時,退出。等所有線程都退出后,你的程序就結(jié)束了。
還有一種方法,叫“線程池”,也就是你說的方法,稍微復(fù)雜一點:
指定一個變量,用來表示線程的數(shù)量。剛開始為0,每開一個線程+1。當(dāng)一個線程完成任務(wù)退出后,這個變量-1。直到所有任務(wù)都完成后,不再產(chǎn)生新線程。
很簡單,調(diào)用API函數(shù)CreateThread
但是用vb做多線程的關(guān)鍵不在于創(chuàng)建,而是在于線程的不穩(wěn)定,其不穩(wěn)定是由于vb6自身的控件(如按鈕、文本框等)不是線程安全的,怎么用你程序就可能怎么掛,所以這些個玩樣兒在多線程中統(tǒng)統(tǒng)不能用。
那么UI的實現(xiàn)也得用API實現(xiàn)。這樣vb的多線程才相對要穩(wěn)定。但是vb的可視化開發(fā)的優(yōu)勢又蕩然無存。
其實這行代碼和C_RunCompleted(image, Nothing)的效果類似,但在BackgroundWorker中解決了“線程安全”的問題。
你可以把多線程看成幾個工人同時干活。如果大家都共用一份材料,然后我給它補(bǔ)一塊,你給它割一塊,他再把其它材料焊上去,豈不是亂套了?Invoke的作用就是用一個線程模型調(diào)用方法,讓主線程先放一邊,這樣就不會亂套了,也就是“線程安全”。你試試直接改成上面的代碼,運(yùn)行時會引發(fā)跨線程異常
我們知道Hashtable 是線程安全的,可由多個讀取器線程或一個寫入線程使用。
它的特點是:通過節(jié)點的關(guān)鍵碼確定節(jié)點的存儲位置,即給定節(jié)點的關(guān)鍵碼k,通過一定的函數(shù)關(guān)系H(散列函數(shù)),得到函數(shù)值H(k),將此值解釋為該節(jié)點的存儲地址.
HashMap 與Hashtable很相似,但HashMap 是非同步(unsynchronizded)和可以以null為關(guān)鍵碼的.
我們知道在使用內(nèi)存中的地址時是按照哪里有空閑的就使用哪里的。怎么可能一直由著我們輸入的順序給你開放地址呢?