Hallo zusammen,
ich habe ein Problem mit einem Thread.
Im Original-Programm wird über einen Timer mehrere Datenbankabfragen hintereinander gestartet, bei einer Abfrage kann ein Event ausgelöst werden.
Dieses Event öffnet dann eine weitere Form. Dies klappt auch alles.
Die Datenbankabfragen dauern aber auch eine gewisse Zeit.
Überlegung ist die Datenbankabfragen in einen Thread auszulagern, damit die Oberfläche bedienbar bleibt und auch auf andere Ereignisse reagiert werden kann.
Das funktioniert auch soweit.
Das Problem liegt im Aufruf der weiteren Form FormBildAuffruf, mit Ende des Thread verschwindet diese auch, soll aber solange erhalten bleiben bis sie manuell geschlossen wird.
Habe mal ein kleines Beispielprogramm geschrieben um die Sache zu verdeutlichen.
Hauptform: TestThreadForm mit Button btnThreadStarten, Label1 und Label2
Form Aufruf über Event: FormBildAufruf mit Label1 und Button btnStop
Klasse: ClassZaehler
TestThreadForm:
Imports System
Imports System.Windows.Forms
Imports System.Threading
Public Class TestThreadWinForm
Dim FormBild As FormBildAufruf
Private Sub btnThreadStarten_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles btnThreadStarten.Click
Dim thThreadtest As New Thread(AddressOf threadBehandlung)
thThreadtest.IsBackground = True
thThreadtest.Start()
End Sub
Sub threadBehandlung()
Dim intTest As Integer
Dim clsZahl As New ClassZaehler(1000)
AddHandler clsZahl.ZaehlSchleifeWert, AddressOf clsZahlWertErreicht
Try
intTest = clsZahl.ZaehlSchleife()
Catch ex As Exception
MessageBox.Show("Fehler Ausführen Klasse ClassZaehler " & _
Environment.NewLine & ex.Message & Environment.NewLine & _
ex.ToString)
Finally
SetValue("Durchlauf TestThread-Nr.: " & intTest.ToString, Label1)
End Try
End Sub
Sub clsZahlWertErreicht(ByVal sender As Object, ByVal e As _
System.EventArgs, ByVal inttest As Integer)
FormBild = New FormBildAufruf
FormBild.strText = "intTest: " & inttest.ToString
FormBild.Show()
FormBild.TopMost = True
End Sub
Delegate Sub SetValueCallback(ByVal text As String, ByVal ctl As Control)
Private Sub SetValue(ByVal text As String, ByVal ctl As Control)
If Me.InvokeRequired Then
Dim del As New SetValueCallback(AddressOf SetProgressValue)
Invoke(del, text, ctl)
Else
Me.Text = text
End If
End Sub
Sub SetProgressValue(ByVal strtext As String, ByVal ctl As Control)
Label2.Text = strtext
ctl.Text = strtext
End Sub
End Class FormBildAufruf:
Public Class FormBildAufruf
Private m_strText As String
Property strText() As String
Get
Return m_strText
End Get
Set(ByVal value As String)
m_strText = value
End Set
End Property
Private Sub FormBildAufruf_Load(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Me.Load
Label1.Text = strText
End Sub
Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles btnStop.Click
Me.Close()
End Sub
End Class ClassZaehler:
Imports System.Threading
Public Class ClassZaehler
Sub New(ByVal IintI As Integer)
intI = IintI
End Sub
Private m_intI As Integer
Property intI() As Integer
Get
Return m_intI
End Get
Set(ByVal value As Integer)
m_intI = value
End Set
End Property
Public Event ZaehlSchleifeWert(ByVal sender As Object, ByVal e As _
System.EventArgs, ByVal intTest As Integer)
Function ZaehlSchleife() As Integer
For i As Integer = 0 To intI
Console.WriteLine("Durchlauf TestThread-Nr.: " & i.ToString)
If i = 500 Then
RaiseEvent ZaehlSchleifeWert(Me, New System.EventArgs, i)
End If
Thread.Sleep(100)
Next
Return intI
End Function
End Class Gibt es eine Möglichkeit FormBildAufruf solange erscheinen zu lassen, bis sie manuell beendet wird?
Oder ist dies die komplett falsche Vorgehensweise?
MfG
Ulrich |