当前位置: 代码迷 >> VB Dotnet >> 子线程操作窗体上的控件,此线程或委托怎么终止
  详细解决方案

子线程操作窗体上的控件,此线程或委托怎么终止

热度:206   发布时间:2016-04-25 02:19:44.0
子线程操作窗体上的控件,此线程或委托如何终止?
本帖最后由 hironpan 于 2014-05-17 19:56:29 编辑
使用多线程控制 Form1 上的 Label 显示,相关代码如下:


    '声明委托
    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



然后按开始按钮,执行后线程根本停不下来(或者说线程可以停下来,但线程调用的委托停不下来)。。
本人菜鸟,请教高手。。

------解决方案--------------------
你自己的线程中就不应该有什么循环、阻塞。

如果你想用低级的Timer,那么就用现成的。自己设计的应该是更高级的分层系统。

应该重新审查你自己的设计逻辑。
------解决方案--------------------
给你几个建议。
1.不要再Invoke里阻塞线程,尤其是调用Thread.Sleep或者等待线程同步对象(比如锁)
2.要终止一个线程,最好由线程自行退出。
对于你的情况可以像这样处理:
在类级别定义一个标志字段,指示线程是否需要终止
Dim NeedStop As Boolean = False

把循环和等待放到线程里进行,每次循环体检查线程是否需要终止,如果是,停止循环,做清理工作后退出
        Do Until NeedStop
            Invoke(Sub()
                          lblText.Text = ""
                      End Sub)
            Delay(1000)
        Loop
        '其他清理工作

------解决方案--------------------
线程的方法跑完了它就终止了。
在.net框架下,不需要过多考虑资源释放的问题。CLR已经帮你都做了。
  相关解决方案