VisualBasic .NET - Threads / Splash / Kommunikation zwischen UI Thread und "worker" Thread

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hallo Zusammen,

leider stoße ich bei Threads immer wieder auf Probleme. Aktuell komm ich mal wieder nicht weiter.
Zunächst einmal das Problem / die Programmumgebung.

Ich habe hier eine Form, die in der Load Methode einige Dinge initialisert.
Code:
Private Sub frm_Hauptform_Load(sender As Object, e As EventArgs) Handles MyBase.Load
   'do method 1'
   'do method 2'
   'do method n'
End Sub

Während dessen soll der User immer wieder informiert werden, wenn eine Methode abgearbeitet wird.
Da ich die Form "frm_Hauptform" in diesem Programmzweig aber nicht anzeige habe ich nach einer Alternative gesucht.
Und bin auf ein Splash gestoßen. Dieses startet ich auch in der Load mit:
Code:
t = New Thread(New ThreadStart(AddressOf SplashStart))
t.Start()

Der eigenliche Splash sieht so aus:
Code:
Private Sub SplashStart()
        Application.Run(test)   'test ist eine 2. Form, entspricht -> Dim test As New frm_BpmGui'
End Sub

Das läuft auch soweit gut. Jetzt würde ich aber gerne nach jeder abgearbeiteten Methode den User darüber informieren.
Sprich in der "frm_BpmGui" ein Label setzen. Da steck ich aber fest. Wie kann ich denn aus dem UI-Thread an den Thread t einen String übergeben? Und ist der Splash so richtig? Hatte mir hierzu ein Tutorial angeschaut, evtl. ist dieses ja auch nicht so gut gewesen.

Danke!

Edit:
Ich denke ich habe die Lösung gefunden! Ich teste noch ein paar Dinge und dann gibt es ne Antwort.
Aber mit ner Delegate und Invoke sieht es gut aus ;)

Edit 2:
Habe jetzt noch ein wenig getestet und bei mir läuft es so 1A. Anbei mein Lösungsansatz,
allerdings kein Gewähr, dass es sich um eine "saubere" Lösung handelt :D

Erweitert habe ich den Code um eine Delegate und eine Methode zum ändern des Labels:

Code:
Public Delegate Sub del_ThreadKomm()

Private Sub frm_Hauptform_Load(sender As Object, e As EventArgs) Handles MyBase.Load
   updateMsg = "Initialisiere Methode 1"
   frmUserInfo.lblUserInfo.Invoke(New del_ThreadKomm(AddressOf UpdateGui))  
   'do method 1'

   updateMsg = "Initialisiere Methode 2"
   frmUserInfo.lblUserInfo.Invoke(New del_ThreadKomm(AddressOf UpdateGui))
   'do method 2'

   updateMsg = "Initialisiere Methode 3"
   frmUserInfo.lblUserInfo.Invoke(New del_ThreadKomm(AddressOf UpdateGui))
   'do method n'
End Sub
  
Private Sub UpdateGui()
        frmUserInfo.label1 = updateMsg
End Sub
 
Zuletzt bearbeitet:
Zurück
Oben