forgottenrealm
Goto Top

Zugriff aus Backgroundworker auf Form

Moinmoin,

ich habe in meinem Programm mehrere Backgroundworker und möchte nun den aktuellen Status des Threads aus dem BGW auf der zugehörigen Form anzeigen.

Die Funktion der vom BGW ausgeführt wird führt weitere Unterfunktionen aus, die mir den Status ausgeben. Als Messagebox funktioniert es, allerdings wird auf der Form nichts angezeigt, wenn eine der Funktionen z.B. Me.Test = CurrentFile.Name als Form Text schreiben soll.

Ich denke mal, es liegt daran dass die vom BGW ausgeführten Funktionen und Subs in einem anderen Thread laufen, der keinen Zugriff auf den eigentlichen Thread mit der Parent Form hat.

Wie stelle ich es an, dass die Werte aus den Funktionen innerhalb des BGW an die Parent Form übergeben werden?

Freundliche, ratlose, Grüße ;)

Content-Key: 344762

Url: https://administrator.de/contentid/344762

Ausgedruckt am: 28.03.2024 um 20:03 Uhr

Mitglied: 133883
133883 28.07.2017 aktualisiert um 12:13:22 Uhr
Goto Top
Mitglied: ForgottenRealm
ForgottenRealm 30.07.2017 aktualisiert um 16:35:42 Uhr
Goto Top
Moin,

damit stoße ich nun auf einen bereits bekannten Fehler, den ich trotz verschiedener Lösungsansetze nicht beheben kann.

Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.

Meine Suche ergab verschiedenes, unter anderem dass zuerst die Form sichtbar sein muss (ist sie), und wenn sie es nicht ist, zuerst ein Me.CreateControl ausgeführt werden muss, funktioniert beides nicht.
Das Beispiel aus diesem Microsoft Beitrag https://msdn.microsoft.com/de-de/library/ms171728.aspx?cs-save-lang=1&am ... habe ich probiert, mit dem folgenden Ergebnis.

'111 ist der alte Code, '222 führt zu dem Beispiel aus dem Microsoft Forum

Private Sub btn_Sync_Click(sender As Object, e As EventArgs) Handles btn_WinSCP_StartSync.Click

	Dim CurrentFunction As String = System.Reflection.MethodBase.GetCurrentMethod.Name

	Try
		Select Case True
			Case sender Is btn_WinSCP_StartSync
				With bgw_WinSCPSync
					If .IsBusy = False Then
						Me.Cursor = Cursors.WaitCursor

						btn_WinSCP_StartSync.Enabled = False
						
						.RunWorkerAsync()
					End If
				End With

			Case sender Is btn_WinSCP_StopSync
				bgw_WinSCPSync.CancelAsync()

			Case Else
				Exit Sub

		End Select

	Catch ex As Exception
		MsgBox(ex.Message & cls_CONST.ENTER &
			   "Funktion: " & CurrentFunction, vbOKOnly + vbCritical, Const_MsgBoxText)  

	End Try

End Sub

Private Sub bgw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgw_WinSCPSync.DoWork

	Dim CurrentFunction As String = System.Reflection.MethodBase.GetCurrentMethod.Name

	Try
		Select Case True
			Case sender Is bgw_WinSCPSync
				'mach was ...  
				
			Case Else
				Exit Sub

		End Select

	Catch ex As Exception
		MsgBox(ex.Message & cls_CONST.ENTER &
			   "Funktion: " & CurrentFunction, vbOKOnly + vbCritical, Const_MsgBoxText)  

	End Try

End Sub

Public Shared Sub SessionFileTransferProgress(ByVal sender As Object, ByVal e As WinSCP.FileTransferProgressEventArgs)

	Dim CurrentFunction As String = System.Reflection.MethodBase.GetCurrentMethod.Name

	Try
		With TI
			If e.FileProgress >= 1 Then
				If Not .LastFile = e.FileName Then
					.BytesTransfered += GetFileSize(e.FileName)
					.FilesTransfered += 1
					
					'frm_Debug.Invoke(New Dlgt_UpdateForm(AddressOf UpdateForm), e) '111  
										
					' With frm_Debug '222  
						' .Thrd = New Thread(New ThreadStart(AddressOf .UpdateContent))  
						' .Thrd.Start(New WinSCP.FileTransferProgressEventArgs() {e})  
					' End With  
				End If

				.LastFile = e.FileName
			End If
		End With

	Catch ex As Exception
		MsgBox(ex.Message & cls_CONST.ENTER &
			   "Funktion: " & CurrentFunction, vbOKOnly + vbCritical, Const_MsgBoxText)  

	End Try

End Sub

Delegate Sub Dlgt_UpdateForm(ByVal e As WinSCP.FileTransferProgressEventArgs) '111  

Public Shared Sub UpdateForm(ByVal e As WinSCP.FileTransferProgressEventArgs)

	Dim CurrentFunction As String = System.Reflection.MethodBase.GetCurrentMethod.Name

	Try
		With frm_Text
			.lab_Info.Text = "Datei: " & e.FileName  
		End With

	Catch ex As Exception
		MsgBox(ex.Message & cls_CONST.ENTER &
			   "Funktion: " & CurrentFunction, vbOKOnly + vbCritical, Const_MsgBoxText)  

	End Try

End Sub

    Private Sub UpdateContent(ByVal e As WinSCP.FileTransferProgressEventArgs) '222  

        Dim CurrentFunction As String = System.Reflection.MethodBase.GetCurrentMethod.Name

        Try
            Me.StatusUpdate(e)

        Catch ex As Exception
            MsgBox(ex.Message & cls_CONST.ENTER &
                   "Funktion: " & CurrentFunction, vbOKOnly + vbCritical, Const_MsgBoxText)  

        End Try

    End Sub

    Delegate Sub Dlgt_UpdateForm(ByVal e As WinSCP.FileTransferProgressEventArgs)

    Private Sub StatusUpdate(ByVal e As WinSCP.FileTransferProgressEventArgs)

        Dim CurrentFunction As String = System.Reflection.MethodBase.GetCurrentMethod.Name

        Try
            With Me
                If .lab_Info.InvokeRequired Then
                    .Invoke(New Dlgt_UpdateForm(AddressOf StatusUpdate), New Object() {e})
                Else
                    .lab_Info.Text = e.FileName
                End If
            End With

        Catch ex As Exception
            MsgBox(ex.Message & cls_CONST.ENTER &
                   "Funktion: " & CurrentFunction, vbOKOnly + vbCritical, Const_MsgBoxText)  

        End Try

    End Sub

Beim zweiten Bespiel wird mir ...
.Thrd = New Thread(New ThreadStart(AddressOf .UpdateContent))
als Fehler gemeldet.
Die Signatur der Private Sub UpdateContent(e as WinSCP.FileTransferProgressEventArgs)-Methode ist mit dem Delegaten "Delegate Sub ThreadStart()" nicht kompatibel. gemeldet.  

Lasse ich bei ...
Private Sub UpdateContent(ByVal e As WinSCP.FileTransferProgressEventArgs)

Die Eigenschaft "ByVal e As WinSCP.FileTransferProgressEventArgs" weg, funktioniert es soweit, dann bekomme ich die Werte aus dem EventArg Objekt nicht mehr in das Sub, welches mir die Werte aktualisieren soll rüber. Sehr kompliziert alles ...

Grüße und noch ein schönes Wochenende face-smile