对于这个问题,我就直接从他的产生说起:
我正在做一款小的软件,用来实践。他的主要功能就是:我点击第一个按钮,他启动a线程;当我点击第二个按钮时,他停止a线程的操作,并且重新启动a线程(线程里面的操作从头开始)。
而我的问题就是,不知道怎么写。
我之前尝试过一些简单的写法,但是都不行(我对线程了解的不多)
以下是我写过的一些方法:
dim a as thread =new thread (adress of abc)
private sub........点击1按钮响应的代码
a.start
end sub
private sub........点击2按钮响应的代码
a.abort '想要终止操作
a.start'想要重新启动操作
end sub
------解决方案--------------------
一个起码的原则是,不要去调用Thread.Abort、Resume、Supsend之类的方法。
你应该使用一个状态量表示是否应该停止线程,让线程自己去退出。
------解决方案--------------------
如果你对线程了解不多,不要胡乱用,这会导致很多严重的后果。先系统学习下:
http://msdn.microsoft.com/zh-cn/library/ms173178.aspx
http://msdn.microsoft.com/zh-cn/library/ms173179.aspx
------解决方案--------------------
给你写个 Console 程序的 demo:
Imports System
Imports System.ComponentModel
Module Module1
Sub Main()
Console.WriteLine("按A开始Proc,B创建/重新创建Proc,C结束")
Dim obj As New ProcType
AddHandler obj.PropertyChanged, AddressOf Obj_IsStoped_Changed
Do
Select Case Console.ReadKey.KeyChar.ToString().ToUpper()
Case "A"
If obj.IsStoped Then obj.Start()
Case "B"
If Not obj.IsStoped Then obj.StopIt()
Case "C"
RemoveHandler obj.PropertyChanged, AddressOf Obj_IsStoped_Changed
If Not obj.IsStoped Then obj.StopIt()
Return
End Select
Loop
End Sub
Sub Obj_IsStoped_Changed(sender As Object, e As PropertyChangedEventArgs)
If e.PropertyName = "IsStoped" Then
Dim obj As ProcType = sender
If obj.IsStoped Then obj.Start()
End If
End Sub
End Module
Imports System.Threading
Imports System.ComponentModel
Public Class ProcType
Implements INotifyPropertyChanged
Dim _Stoped As Boolean = True
Public Property IsStoped As Boolean
Get
Return _Stoped
End Get
Set(value As Boolean)
If value <> _Stoped Then
_Stoped = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("IsStoped"))
End If
End Set
End Property
Public Sub Start()
ThreadPool.QueueUserWorkItem(AddressOf Proc)
End Sub
Private Sub Proc(x As Object)
Dim n As Integer
IsStoped = False
StopFlag = False
Do Until StopFlag
Console.Write(n)
n += 1
Thread.Sleep(1000)
Loop