Sub Main()
創(chuàng)新互聯(lián)公司是少有的成都網(wǎng)站制作、做網(wǎng)站、營銷型企業(yè)網(wǎng)站、小程序開發(fā)、手機APP,開發(fā)、制作、設(shè)計、賣鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,從2013年成立,堅持透明化,價格低,無套路經(jīng)營理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評
Dim thr As Thread
For Pi As Integer=0 To 4 //啟用5線程
MulParams =Pi vbTab sFile vbTab dFile vbTab 1 vbTab DelN vbTab cr vbTab cg vbTab cb vbTab IndexI
GlobalParamas(pi)=MulParams .Split(vbTab)
thr=New Thread(AddressOf MyMulThreadCaller)
thr.Start() //啟動多線程進程
Application.DoEvents
Next
End Sub
下面的代碼示例說明了更改線程優(yōu)先級的結(jié)果。創(chuàng)建兩個線程,其中一個線程的優(yōu)先級設(shè)置為 BelowNormal。兩個線程在 while 循環(huán)中都增加一個變量,并運行一段設(shè)定的時間。
Option Explicit
Option Strict
Imports System
Imports System.Threading
Public Class Test
MTAThread _
Shared Sub Main()
Dim priorityTest As New PriorityTest()
Dim threadOne As Thread = _
New Thread(AddressOf priorityTest.ThreadMethod)
threadOne.Name = "ThreadOne"
Dim threadTwo As Thread = _
New Thread(AddressOf priorityTest.ThreadMethod)
threadTwo.Name = "ThreadTwo"
threadTwo.Priority = ThreadPriority.BelowNormal
threadOne.Start()
threadTwo.Start()
' Allow counting for 10 seconds.
Thread.Sleep(10000)
priorityTest.LoopSwitch = False
End Sub
End Class
Public Class PriorityTest
Dim loopSwitchValue As Boolean
Sub New()
loopSwitchValue = True
End Sub
WriteOnly Property LoopSwitch As Boolean
Set
loopSwitchValue = Value
End Set
End Property
Sub ThreadMethod()
Dim threadCount As Long = 0
While loopSwitchValue
threadCount += 1
End While
Console.WriteLine("{0} with {1,11} priority " _
"has a count = {2,13}", Thread.CurrentThread.Name, _
Thread.CurrentThread.Priority.ToString(), _
threadCount.ToString("N0"))
End Sub
End Class
請參考csdn中的vbcon98.chm:
★ 單線程的部件與單元模型
Visual Basic 創(chuàng)建的所有部件都使用單元模型,無論該部件是單線程的還是多線程的。單線程的部件只有一個單元,該單元包含部件提供的所有對象。
這就意味著用 Visual Basic 創(chuàng)建的單線程的 DLL 可以安全地用于多線程的客戶端。不過,性能與安全是一對矛盾,這種安全性損失了性能。除了當(dāng)前的客戶端線程之外,其它所有的客戶端線程的調(diào)用都要等待被調(diào)度,就好象這些調(diào)用是進程外調(diào)用。請參閱“設(shè)計線程安全的 DLL”。
線程的所有權(quán)
多線程的進程內(nèi)部件沒有自己的線程。如“設(shè)計線程安全的 DLL”中所述,定義每個單元的線程都屬于客戶端。
與此相對的是,多線程的進程外部件可能有一個固定線程數(shù)目的線程池,或者為每個外部創(chuàng)建的對象設(shè)置一個線程。
★ 設(shè)計多線程的進程外部件
您可以利用單元模式進程化,建立多線程的進程外部部件。這種部件提供的對象可以運行在不同的執(zhí)行線程上。
為了將對象指派到進程外部件中的線程,Visual Basic 提供了三種模型??梢栽凇肮こ虒傩浴睂υ捒蛑性O(shè)置“通用”選項卡的“無用戶界面執(zhí)行”框,選擇其中的一種模型。
線程指派模型 “無用戶界面執(zhí)行”的設(shè)置
單一的執(zhí)行線程 選擇“線程池”選項,指定線程數(shù)為一。
循環(huán)指派線程的線程池 選擇“線程池”選項,并指定可用的線程數(shù)目。
每個在外部創(chuàng)建的對象有一個屬于自己的線程 選擇“每個對象的線程”選項。
單一的執(zhí)行線程
當(dāng)選擇“無用戶界面執(zhí)行”時,單一的執(zhí)行線程是缺省設(shè)置。使用該選項可以編譯 Visual Basic 早期版本開發(fā)的部件,無需考慮線程。
如果使用“無用戶界面執(zhí)行”選項來重新編譯部件,該服務(wù)器將不能再顯示出消息框,也就無法獲得管理員的干預(yù)。不過,這種消息可以被記錄到 Windows NT 的事件日志(或另外選擇的日志文件),請參閱“多線程部件的事件日志”。
循環(huán)的線程池
當(dāng)客戶端請求對象時,Visual Basic 使用在線程池的下一個線程上創(chuàng)建所需的對象。當(dāng)線程到達線程池的尾端時,就從頭開始。
Public?Class?Form1
Public?Class?SquareClass?'把多線程調(diào)用的函數(shù)封裝到類中,通過類事件返回
Public?Value?As?Double
Public?Square?As?Double
Public?Event?ThreadComplete(ByVal?Square?As?Double)
Public?Sub?CalcSquare()
Square?=?Value?*?Value
RaiseEvent?ThreadComplete(Square)
End?Sub
End?Class
Dim?WithEvents?oSquare?As?SquareClass
Private?Sub?Button1_Click(sender?As?Object,?e?As?EventArgs)?Handles?Button1.Click?'多線程返回值測試,當(dāng)線程運行完成激發(fā)事件
oSquare?=?New?SquareClass()
Dim?t?As?New?Threading.Thread(AddressOf?oSquare.CalcSquare)
oSquare.Value?=?30
t.Start()
End?Sub
Sub?SquareEventHandler(ByVal?Square?As?Double)?Handles?oSquare.ThreadComplete?'響應(yīng)事件函數(shù)
MsgBox("The?square?is?"??Square)
End?Sub
End?Class
用time控件啊,獲取threadstate后,按指定時間間隔規(guī)定向界面刷新,線程必須是全局變量
用一個有退出條件的無限循環(huán)的sub也行。
線程開始就觸發(fā)該過程,用無限循環(huán)來刷新狀態(tài),線程完成即退出無限循環(huán)。局部變量的線程也可以用這種方式。
不過用法要正確,否則會出問題。
這個沒法做到。原因
1)當(dāng)你將方法排入線程池隊列后,此方法在有線程池線程變得可用時執(zhí)行。
2)線程池中某個線程的可用與不可用,是由.net 后臺決定,用戶程序無法控制的
3)正如你觀察到的:線程啟動的時間不同,有快有慢,這恰恰說明線程池起作用了:線程池的調(diào)度試圖讓程序響應(yīng)達到最佳。