[求助]请教一些跨线程事件响应和显示的问题
vb.net吧
全部回复
仅看楼主
level 1
新手,多线程的部分有很多不明白,想请教一下大家,望不吝赐教
下面贴上代码,代码有两组,实际上想做的都是一件事
程序有三个部分,类Class1,窗体Form1,Form2
在Form1内实例化Class1为C1,在Form2内显示一些C1通过事件传出的信息
代码1
Imports System.Threading
Public Class Class1
Public Event EvenNumber(ByVal n As Integer)
Private Num As Integer
Private StopThread As Boolean = False
Public Sub ThdStart()
Dim Thd As New Thread(AddressOf ThdAdd)
StopThread = False
Thd.Start()
End Sub
Public Sub ThdStop()
StopThread = True
End Sub
Private Sub ThdAdd()
Do While StopThread = False
Thread.Sleep(1000)
Num = Num + 1
If Num Mod 2 = 0 Then
RaiseEvent EvenNumber(Num)
End If
Loop
End Sub
End Class
Public Class Form1
Public WithEvents C1 As New Class1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
C1.ThdStart()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
C1.ThdStop()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Form2.Show()
End Sub
Private Sub C1_EvenNumber(ByVal n As Integer) Handles C1.EvenNumber
Me.Invoke(New Form2.DlgShowText(AddressOf Form2.ShowText), n.ToString) 'A
End Sub
End Class
Public Class Form2
Public Delegate Sub DlgShowText(ByVal s As String)
Public Sub ShowText(ByVal s As String)
TextBox1.Text = s 'B
End Sub
End Class
A处能响应事件,并且能执行到B处,而且不报错,但是textbox1里面并不显示任何内容,请教各位高手这是为何
代码2
Imports System.Threading
Public Class Class1
Public Event EvenNumber(ByVal n As Integer)
Private Num As Integer
Private StopThread As Boolean = False
Public Sub ThdStart()
Dim Thd As New Thread(AddressOf ThdAdd)
StopThread = False
Thd.Start()
End Sub
Public Sub ThdStop()
StopThread = True
End Sub
Private Sub ThdAdd()
Do While StopThread = False
Thread.Sleep(1000)
Num = Num + 1
If Num Mod 2 = 0 Then
RaiseEvent EvenNumber(Num)
End If
Loop
End Sub
End Class
Public Class Form1
Public WithEvents C1 As New Class1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
C1.ThdStart()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
C1.ThdStop()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Form2.Show()
End Sub
End Class
Public Class Form2
Public Delegate Sub DlgShowText(ByVal s As String)
Public Sub ShowText(ByVal s As String)
TextBox1.Text = s
End Sub
Private Sub C1OnEvenNumber(ByVal n As Integer)
Me.Invoke(New DlgShowText(AddressOf ShowText), n.ToString) 'C
End Sub
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler Form1.C1.EvenNumber, AddressOf C1OnEvenNumber
End Sub
End Class
打开form2可以在textbox1中正确显示,在form2从未打开时和form2已经打开时不会出错,但是只要打开过form2,然后关掉,就会在C处报错"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。",请教高手这又是为何
2014年12月03日 16点12分 1
level 12
直接说明一下你想程序做到什么样的效果,在贴吧上看这个代码很头大,因为不能像VB那样把代码给排好。
2014年12月04日 09点12分 2
代码其实很简单,不用代码实在是说不清楚,按照网上学来的办法能达到效果,这里贴出代码是想搞清楚从一开始到现在没弄明白的东西
2014年12月04日 15点12分
1