Imports System.Threading PublicClass Form1 Dim mythread As Thread
PrivateSub Button1_Click(sender AsObject, e As EventArgs) Handles Button1.Click mythread = New Thread(AddressOf ShowNumber) '构造线程 mythread.Name = "myShowNumber" mythread.Start() '启动线程 EndSub
PrivateSub ShowNumber() Dim i As Int32 For i = 0To123451 TextBox1.Text = i Next
mythread.Abort() '终止线程 EndSub
PrivateSub Button2_Click(sender AsObject, e As EventArgs) Handles Button2.Click TextBox2.Text = "终于出现奇迹" EndSub EndClass
然而一点击,发现出错,提示:线程间操作无效: 从不是创建控件“TextBox1”的线程访问它。
这是因为Textbox1是主线程中的,却在另一个新的线程中访问,这种是不安全的,相当于去别人房间使用电视机。 怎么办?这里可以用委托,委托能够进别人房间的人去使用电视机。 3、委托 委托的思想,就是自己不能干或不想干的事,委托另一个有能力或有权限的人去干那件事。 实际上,我们一直要用委托思想,比如基本类型的变量名。Dim i As Integer i变量名就是相当于委托,实际上,一个变量代表的是指定内存地址中的值,如果不用变量名,就得实际上引用这个内存的地址。 而我们就用“变量名”来干操作这个地址里的东西。 除了变量名可以用委托一样,方法也可以用委托,这就是我们普通所说的委托。 定义和使用大致与变量名的方式一样: (1)定义委托类型: Private Delegate Sub MyDelegate(byval k as int32) ‘参数多种,多个) 这里类似定义变量的类型一样。 (2)定义要赋的具体“值”: 这里的具体值,不是值,而是一个具体的方法,方法的形式必须与上面定义保持一致。就象变量名是整形时,赋值也应该是整形,而不是String. 例如:Private Sub YourSelfMethod(byval m as int32) ‘方法名自定,但形式与(1)保持一致。 (3)调用这个值: 也就是委托去办事。用Invoke方法:Control.Invoke(New MyDelegate(AddressOf YourSelfMethod), intValue) 这一步就把(1),(2)使用上了。 下面接着上面的例子,使用委托来调用Form1中的TextBox1.
Imports System.Threading PublicClass Form1 Dim mythread As Thread PrivateDelegateSub VoidShow(ByRef i As Int32) '定义要委托的类型
PrivateSub Button1_Click(sender AsObject, e As EventArgs) Handles Button1.Click mythread = New Thread(AddressOf ShowNumber) mythread.Name = "myShowNumber" mythread.Start() EndSub
PrivateSub ShowNumber() Dim i As Int32 For i = 0To123451 'TextBox1.Text = i Me.Invoke(New VoidShow(AddressOf TureShowNumber), i) '用New构造委托,再用Invoke执行 Next
mythread.Abort() EndSub
'新加入的被委托要做的事 PrivateSub TureShowNumber(ByRef i As Int32) TextBox1.Text = i EndSub
PrivateSub Button2_Click(sender AsObject, e As EventArgs) Handles Button2.Click TextBox2.Text = "终于出现奇迹" EndSub EndClass
Imports System.IO Imports System.Threading PublicClass Form1 Dim btArray(15) AsByte Dim fs As FileStream Dim myThread As Thread Dim blnProcess AsBoolean'进程是否使用标志