none
关于线程处理的问题 RRS feed

  • 问题

  • 当我按了3次button3后,系统会在后台建立3个进程,而且一直存在,当我按Button2后只会结束一个进程.这种问题该怎么解决啊,还有我采用的方法有什么问题啊.








    Imports
    System.Threading Public Class Form1 Private i As Integer = 1 Private exitthread As Boolean = False Private Sub threadtest() Do i += 1 Thread.Sleep(100) Loop Until exitthread = True End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MessageBox.Show(i) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click exitthread = True End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim a As Thread a = New Thread(AddressOf threadtest) a.start End Sub End Class
    2009年9月6日 3:37

答案

  • 您好,我这里测试可以关闭的,您通过线程窗口来看看。
    2009年9月6日 9:08
  • 你好!
         由于你没有对exitthread进行同步控制,所以这三个线程有可能不会马上结束循环的,有的线程读取到的exitthread是true,而有的线程读到的确实false,也就是说可能这三个线程不会同时结束!
         你可以使用读写锁来让三个线程读取到同样的值!
    周雪峰
    2009年9月6日 11:40
    版主

全部回复

  •  您好,线程还未执行。
    把button3事件改为:

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Dim a As Thread
            a = New Thread(AddressOf threadtest)
            a.Start()
        End Sub
    2009年9月6日 4:08
  • 不好意思,是我提问时没有把这个start加进去,我的实际代码中是有这个的.我的问题是当exitthread变量为true时,系统只能关闭一个线程,还有两个线程关不掉. 
    2009年9月6日 8:40
  • 您好,我这里测试可以关闭的,您通过线程窗口来看看。
    2009年9月6日 9:08
  • 你好!
         由于你没有对exitthread进行同步控制,所以这三个线程有可能不会马上结束循环的,有的线程读取到的exitthread是true,而有的线程读到的确实false,也就是说可能这三个线程不会同时结束!
         你可以使用读写锁来让三个线程读取到同样的值!
    周雪峰
    2009年9月6日 11:40
    版主
  • 我看过线程窗口,只关了一个线程
    2009年9月6日 11:54
  • 谢谢你,指导我解决问题的思路,其他的我会慢慢研究的.
    2009年9月6日 11:55
  • 我看过线程窗口,只关了一个线程

    您好,我这里确实3个都关闭了,是否有别的线程干扰了。您可以给每个线程设一个名字。以便观察。
    另,我也曾想过同步问题,可是代码中是无限循环,这次读不到true,下次就能读到,只有0.1秒的间隔。所以我认为不是同步造成的。
    而我的测试结果也是3个都关闭。
    2009年9月6日 12:25