16,554
社区成员
发帖
与我相关
我的任务
分享
'声明委托
Delegate Sub DelegateThreadTask()
'局部变量:
Private thread_DisplayControl As Thread, delegate_DisplayControl As DelegateThreadTask
'开始按钮
Private Sub btnBegin_Click(sender As Object, e As EventArgs) Handles btnBegin.Click
thread_DisplayControl = New Thread(AddressOf ThreadDisplayControl) '实例一下线程
thread_DisplayControl.Start() '线程开始
End Sub
'终止按钮
Private Sub btnAbort_Click(sender As Object, e As EventArgs) Handles btnAbort.Click
thread_DisplayControl.Abort() '线程终止
End Sub
'线程
Private Sub ThreadDisplayControl()
Debug.WriteLine("线程里调用委托")
delegate_DisplayControl = New DelegateThreadTask(AddressOf SubDisplayControl)
Invoke(delegate_DisplayControl)
Debug.WriteLine("委托结束啦!")
End Sub
'委托调用
Private Sub SubDisplayControl()
Do
'每隔1秒钟,循环更新Form1上的Label信息
lblControl.Text = Now
Delay(1000) '延时函数
Loop
End Sub
Public Sub TestThread()
Dim testStr As String, testInt As Integer, testObj As Object
Dim NeedStop As Boolean = False
Do Until NeedStop
'上面定义的 testStr\testInt\testObj 进行赋值等操作
Loop
'清理工作是这样做的吗?
testStr = Nothing : testInt = Nothing : testObj = Nothing
End Sub
我突然灵光一闪,想到一个方案,不知道可行否。。
1、解释为什么我想从外部来结束这个线程或委托
由于线程执行的委托里有调用好多的Sub、Funtion过程,而且每个调用的过程都可能出错,如果在每个Sub、Funtion过程调用之后都进行判断是否退出,感觉还是有点麻烦的。。所以我才会想用一个外部过程来终止这个线程/委托。。
2、解释为什么需要使用委托
不使用委托的情况下(即委托的所有代码全部放到线程的Sub里执行),外部直接执行线程的Abort命令,一般是可以终止此线程的,不过很容易出问题,所以我不得不用委托来执行。。除了委托,直接由界面调用也是可行的(比如Button1的Click事件里直接调用委托的Sub过程)
3、我想到的方案
我理解的委托含义如4楼所述(不知道对不对),我觉得这也是为什么只用线程不用委托就会出问题,而直接界面调用没问题的原因。。
所以我想创建一个新的窗体Form2,在Form2的Load事件中直接调用我想要进行的操作(即上面委托里的操作),然后通过一个共享变量值来判断是否需要结束,结束操作由Form1来循环判断并执行。。。
终止命令我搜到了一些API函数,如DestroyWindow、TerminateProcess、NtTerminateProcess
目前测试下来还是小有进展的。。
大侠评论一下我这个想法吧~~Dim NeedStop As Boolean = False
把循环和等待放到线程里进行,每次循环体检查线程是否需要终止,如果是,停止循环,做清理工作后退出
Do Until NeedStop
Invoke(Sub()
lblText.Text = ""
End Sub)
Delay(1000)
Loop
'其他清理工作