Ergebnis aus Thread in einem zweitem Dialog

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    Ergebnis aus Thread in einem zweitem Dialog

    Hallo zusammen,

    ich habe ein Problem bei dem ich einfach nicht weiter komme. Wahrscheinlich ist die Lösung sehr einfach aber ... naja.
    Ich möchte mittels Thread eine Schleife durchlaufen und das Ergebnis direkt in einem zweiten Form ausgeben lassen.
    Sofern die Form2 mittels ShowDialog() aufgerufen passiert natürlich nichts bis ich diese schließe.. Bei Verwendung von Show() verschwindet die zweite Form gleich wieder.

    Ich habe euch das Projekt beigefügt. Vielleicht kann mir jemand helfen die Lösung zu finden.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Thread_Zaehlen As System.Threading.Thread
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Thread_Zaehlen.Start()
    5. End Sub
    6. Sub ThreadAufgabe()
    7. Using dlg As New Form2
    8. dlg.Show()
    9. dlg.Visible = True
    10. End Using
    11. For i = 0 To 10000
    12. Label1.Text = i
    13. Label1.Refresh()
    14. Form2.Label1.Text = i
    15. Form2.Label1.Refresh()
    16. Next
    17. End Sub
    18. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    19. Thread_Zaehlen = New System.Threading.Thread(AddressOf ThreadAufgabe)
    20. Control.CheckForIllegalCrossThreadCalls = False
    21. Thread_Zaehlen.Priority = Threading.ThreadPriority.Highest
    22. End Sub
    23. End Class


    Danke vorab
    Dateien
    • Test Thread.rar

      (66,68 kB, 78 mal heruntergeladen, zuletzt: )
    Threading geht so nicht.
    Alle Gui-Elemente müssen im selben Thread laufen, sonst bricht Chaos aus.
    Du aber erstellst in deim Thread eine Form2-Instanz, und die läuft dann in einem anderen Thread als Form1, und das kann schoma nix werden.

    Es gibt allerdings ausnahmen - etwa bei einem "IsBusy"-Form, oder einem SplashScreen ist zumindest theoretisch denkbar, dass die nebenläufig laufen - ob das gut wäre, sei dahingestellt.

    Also wie so oft die Frage: Was willst du eiglich erreichen?
    also eine IsBusy-Anzeige. Theoretisch kann man die nebenläufig halten.
    Aber besser nur theoretisch, denn ein Rechen-Thread bremst nicht nur das Form aus, sondern es gilt auch andersrum: ein Form im selben Thread bremst natürlich den Rechen-Thread aus.

    nu schau deinen Code:

    VB.NET-Quellcode

    1. Sub ThreadAufgabe()
    2. Using dlg As New Form2
    3. dlg.Show()
    4. dlg.Visible = True
    5. End Using
    6. For i = 0 To 10000
    7. Label1.Text = i
    8. Label1.Refresh()
    9. Form2.Label1.Text = i
    10. Form2.Label1.Refresh()
    11. Next
    12. End Sub
    nee, schau das besser nicht.
    Da geht ja alles durcheinander. Erst wird dlg erstellt, angezeigt und wieder geschlossen (End Using).
    Dann wird 10000 in einer unsichtbaren Form2-Instanz ein Label refresht. Ach, und im Form1 auch 10000 mal.

    ich denke das einfachste wird sein...
    ach-grundgütiger, du proggst ja auch noch Strict Off!!

    nee, also gar kein Zweck. Lösch alle deine Threading-Versuche, und richte erstmal dein VisualStudio so ein, dass man damit verantwortlich arbeiten kann: Visual Studio - Empfohlene Einstellungen

    Hat imo kein Zweck, da jetzt mit Threading was anfangen und erklären zu wollen, solange die Chaos-Einstellungen verschleiern, was wirklich passiert.
    @steffen_cl Übertrage die Daten per Event, und im Dialog musst Du sie per Invoke/BeginInvoke an die Controls bringen.
    Wie oft und wie viele Daten werden da übertragen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ehm ... puh. Da hast Du aber 2 Kleinigkeiten drin, die noch geändert werden müssten:
    1. Dass Du in Form1 eine Instanz von Form2 erstellst und deren Label innerhalb von Form1 veränderst, ist eine Sache. Aber in Form2 Form1.Thread_Zaehlen.Abort() zu verwenden, ist »not the yellow of the egg«. Das ist unsauber, da Form2 ein Member von Form1 ist und somit Form2 keine Berechtigungen für Form1-Änderungen haben soll/darf/wieauchimmer. Ein EventRaising wäre z.B. besser => Form2 teilt Form1 mittels Event mit, dass der Thread abgebrochen werden soll. Ggf. hat noch jemand einen anderen/besseren Vorschlag. Die Settings lassen wir da aber mal für solch einen Zweck aus dem Spiel.
    2. Schließt man Form2 z.B. über die ControlBox (oben links das rote [X]) und klickt in Form1 erneut auf [Start], entsteht ein weiterer Thread => es laufen mehrere gleichzeitig, was dann ziemlich schnell böse endet.

    Ok, ich weiß, ist nur ein Testprojekt, aber nicht, dass die Punkte bei weiteren, echten Produktivprojekten untergehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Jou.
    @steffen_cl Schmeiß das Projekt weg und fang bei Feld Nr. 1 erneut an :!:
    • Form1.Thread_Zaehlen.Abort() ist ein NoGo :!:
    • Control.CheckForIllegalCrossThreadCalls = False ist ein NoGo :!:
    Auch wenn hier MDI nicht explizit behandelt wird: gugst Du Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Manchmal muss man die GUI und die eigenen Wünsche der praktikabilität anpassen. Vor allem, wenn es technisch anspruchsvoll ist. Dein Wunsch ist so etwas, wo man überlegen sollte ob eine 2. Form wirklich zwingend nötig ist, oder ob man das nicht lieber ein einer Form macht...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen