不同线程之间传递dataset的问题、

當我在窗體中調用線程時返回5號錯誤[在不同的執行緒上建立的控制項不是父項],請幫忙解決,是思路的錯誤還時方法的錯誤?
窗體上的控件項目有:
1、MenuItem1 ,MenuItem2 為彈出菜單項,分別用於開始和結束線程
2、DataGrid1 數據查詢結果,並在其CaptionText上顯示線程的執行的實時狀態!
3、OleDbConnection1 存有連接數據庫字串

具體代碼如下:
'以下為類的代碼
Imports System.Threading
Public Delegate Function SomethingToDo(ByVal String1 As String, ByVal String2 As String) As Object
Public Class C_ThreadDoing

Private T_Doing As Thread
Private T_Status As Thread
Private T_Paused As ManualResetEvent
Private T_Cancel As Boolean
Private T_Owner As Form
Private T_Control As Control
Public SomethingDoing As SomethingToDo
Public SomethingParameter As ArrayList
Public Event Erroring(ByVal ex As Exception)

Private abcd As Object

Dim WithEvents T_Time As New System.Windows.Forms.Timer()

Public Sub New()
T_Doing = Nothing
T_Cancel = False
T_Owner = Nothing
T_Control = Nothing
T_Paused = New ManualResetEvent(False)

End Sub

Public Property Owner() As Form
Get
Return T_Owner
End Get
Set(ByVal Value As Form)
T_Owner = Value
End Set
End Property

Public Property StatusControl() As Control
Get
Return (T_Control)
End Get
Set(ByVal Value As Control)
T_Control = Value
End Set
End Property

Public Sub Start()
T_Doing = New Thread(AddressOf BegineDoing)
T_Doing.Name = "Thread Class Doing"
T_Doing.Start()
T_Status = New Thread(AddressOf ChangeStatus)
T_Status.Name = "Thread Class Status"
T_Time.Interval = 1000
T_Time.Enabled = True
T_Status.Start()
End Sub

Public Sub Cancel()
T_Cancel = True
T_Time.Enabled = False
T_Paused.Set()
End Sub

Private Sub BegineDoing()
Try
abcd = CType(SomethingDoing.Invoke(SomethingParameter(0), SomethingParameter(1)), DataView)
Catch ex As Exception
RaiseEvent Erroring(ex)
End Try
End Sub

Private Sub ChangeStatus()
Try
Do While True
T_Paused.WaitOne()
If T_Cancel Then Exit Do
CType(T_Control, DataGrid).CaptionText = Now.ToString & vbTab & T_Doing.ThreadState.ToString
If T_Doing.ThreadState = ThreadState.Stopped Then Exit Do
T_Paused.Reset()
Loop
If T_Doing.ThreadState <> ThreadState.Stopped Then
T_Doing.Abort()
End If
CType(T_Control, DataGrid).DataSource = CType(abcd, DataView)
T_Doing.Join()
T_Control.Text = Now.ToString & vbTab & T_Doing.ThreadState.ToString
T_Doing = Nothing
Catch ex As Exception
RaiseEvent Erroring(ex)
End Try
End Sub

Private Sub T_Time_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles T_Time.Tick
T_Paused.Set()
End Sub
End Class

'以下是窗體代碼
Imports System.Data.OleDb

Public Class Form1
Inherits System.Windows.Forms.Form

Dim WithEvents T_Class As C_ThreadDoing

Private Function DataDoing(ByVal cc As String, ByVal bb As String) As Object
MsgBox(cc & vbCrLf & bb)
Dim myd As New OleDbDataAdapter(bb, cc)
Dim MyS As New DataSet()
myd.Fill(MyS)
Return MyS.Tables(0).DefaultView
End Function

Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
Dim MyP As New ArrayList()
MyP.Add(OleDbConnection1.ConnectionString)
MyP.Add("select * from all_all_tables")
T_Class = New C_ThreadDoing()
T_Class.StatusControl = Me.DataGrid1
T_Class.Owner = Me
T_Class.SomethingDoing = AddressOf DataDoing
T_Class.
---------------------------------------------------------------

不可能,呢都实例了。
T_Class = New C_ThreadDoing()
这不是你实例化吗?
一个没有实例化的类,除了Share的函数可以直接调用,其他都不行的。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus