Forums Neueste Beiträge
 

Threading - Problem - Exception

21/09/2007 - 09:06 von Michael W. | Report spam
Moin zusammen,

ich habe eine Windows-Forms Anwendung mit VS2005 erstellt.
Innerhalb dieser Anwendung soll wenn berechnungen vorgenommen werden eine
Animation und eine Stoppuhr angezeigt werden, welche dem User signalisiert,
das gearbeitet wird.

Dazu habe ich ein Form erstellt, welches die Animation und ein label
enthàlt. die Zeit wird per Timer weitergezàhlt.

Das Problem ist nun, das es sehr hàufig zu einer ThreadAbortException kommt,
bei der ich nicht feststellen kann, wann genau sie auftritt und weshalb.

Wer kann hier helfen?

Viele Dank

Michael

Folgenden Code Verwende ich:
Private Sub tspProgress_VisibleChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles tspProgress.VisibleChanged
Try
If tspProgress.Visible = True Then
Me.Enabled = False
Startzeit = Now
Dim WorkingStart As
System.Threading.ParameterizedThreadStart = New
System.Threading.ParameterizedThreadStart(AddressOf ShowfrmWorking)
workingThread = New System.Threading.Thread(WorkingStart)

workingThread.SetApartmentState(System.Threading.ApartmentState.STA)
workingThread.Start()
Else
Me.Enabled = True
If (Not workingThread Is Nothing AndAlso
workingThread.IsAlive) Then
workingThread.Abort()
End If
While (workingThread.IsAlive)
Application.DoEvents()
End While
End If
Catch ex As Threading.ThreadAbortException
ErrorLog(ex)
Catch ex As Exception
ErrorLog(ex)
End Try
End Sub

Public Sub ShowfrmWorking(ByVal Obj As Object)
Try
fWorking = New frmWorking
fWorking.ShowDialog()
Catch ex As Exception

End Try
End Sub
Das anzuzeigende Form:

Public Class frmWorking
Inherits System.Windows.Forms.Form
Dim Startzeit As DateTime

Private Sub frmWorking_HandleDestroyed(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.HandleDestroyed
Try
Timer.Enabled = False
Catch ex As Threading.ThreadAbortException
ErrorLog(ex)
Catch ex As Exception
ErrorLog(ex)

End Try
End Sub

Private Sub frmWorking_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
Try
Startzeit = Now
Timer.Enabled = True
Catch ex As Threading.ThreadAbortException
ErrorLog(ex)

Catch ex As Exception
ErrorLog(ex)
End Try
End Sub

Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer.Tick
Try
Me.Label1.Text = Format(DateAdd(DateInterval.Second,
DateDiff(DateInterval.Second, Startzeit, Now), New DateTime(Now.Year,
Now.Month, Now.Day, 0, 0, 0)), "00:mm:ss")
Me.Label1.Refresh()
Me.Refresh()
Catch ex As Threading.ThreadAbortException
ErrorLog(ex)

Catch ex As Exception
ErrorLog(ex)

End Try
End Sub
End Class
 

Lesen sie die antworten

#1 Armin Zingler
21/09/2007 - 11:12 | Warnen spam
"Michael W." schrieb
Moin zusammen,

ich habe eine Windows-Forms Anwendung mit VS2005 erstellt.
Innerhalb dieser Anwendung soll wenn berechnungen vorgenommen werden
eine Animation und eine Stoppuhr angezeigt werden, welche dem User
signalisiert, das gearbeitet wird.

Dazu habe ich ein Form erstellt, welches die Animation und ein label
enthàlt. die Zeit wird per Timer weitergezàhlt.

Das Problem ist nun, das es sehr hàufig zu einer
ThreadAbortException kommt, bei der ich nicht feststellen kann, wann
genau sie auftritt und weshalb.

Wer kann hier helfen?

Viele Dank

Michael

Folgenden Code Verwende ich:
Private Sub tspProgress_VisibleChanged(ByVal sender As Object, ByVal
e As System.EventArgs) Handles tspProgress.VisibleChanged
Try
If tspProgress.Visible = True Then
Me.Enabled = False
Startzeit = Now
Dim WorkingStart As
System.Threading.ParameterizedThreadStart = New
System.Threading.ParameterizedThreadStart(AddressOf ShowfrmWorking)
workingThread = New
System.Threading.Thread(WorkingStart)

workingThread.SetApartmentState(System.Threading.ApartmentState.STA)
workingThread.Start()
Else
Me.Enabled = True
If (Not workingThread Is Nothing AndAlso
workingThread.IsAlive) Then
workingThread.Abort()
End If
While (workingThread.IsAlive)
Application.DoEvents()
End While
End If
Catch ex As Threading.ThreadAbortException
ErrorLog(ex)
Catch ex As Exception
ErrorLog(ex)
End Try
End Sub

Public Sub ShowfrmWorking(ByVal Obj As Object)
Try
fWorking = New frmWorking
fWorking.ShowDialog()
Catch ex As Exception

End Try
End Sub
Das anzuzeigende Form:

Public Class frmWorking
Inherits System.Windows.Forms.Form
Dim Startzeit As DateTime

Private Sub frmWorking_HandleDestroyed(ByVal sender As Object, ByVal
e As System.EventArgs) Handles Me.HandleDestroyed
Try
Timer.Enabled = False
Catch ex As Threading.ThreadAbortException
ErrorLog(ex)
Catch ex As Exception
ErrorLog(ex)

End Try
End Sub

Private Sub frmWorking_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Me.Load
Try
Startzeit = Now
Timer.Enabled = True
Catch ex As Threading.ThreadAbortException
ErrorLog(ex)

Catch ex As Exception
ErrorLog(ex)
End Try
End Sub

Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer.Tick
Try
Me.Label1.Text = Format(DateAdd(DateInterval.Second,
DateDiff(DateInterval.Second, Startzeit, Now), New
DateTime(Now.Year, Now.Month, Now.Day, 0, 0, 0)), "00:mm:ss")
Me.Label1.Refresh()
Me.Refresh()
Catch ex As Threading.ThreadAbortException
ErrorLog(ex)

Catch ex As Exception
ErrorLog(ex)

End Try
End Sub
End Class



Spontan würde ich auf workingThread.Abort() als Ursache tippen. Dort schon
mal einen Haltepunkt gesetzt?

Irgendwie ist mir die Vorgehensweise schleierhaft - was nichts heißen muss.
;-) Darf ich fragen, warum du frmWorking in einem anderen Thread anzeigst?
Sollte nicht der eigentliche Job im anderen Thread gestartet werden? Für
mich ist auch nicht ersichtlich, warum im tspProgress_VisibleChanged die
Aktion gestartet wird: Was ist tspProgress? Wann/warum wird die
Visible-Eigenschaft gesetzt?

Zur Berechnung der Dauer bietet sich übrigens der Typ Timespan an:

ts = date.now.subtract(startzeit)


Nebenbei, für Application.DoEvents gibt es normalerweise keine
Daseinsberechtigung.



Armin

Ähnliche fragen