Maulwurf_der_Schlaue Geschrieben 14. Februar 2006 Teilen Geschrieben 14. Februar 2006 Hallo miteinander, neuer Tag neues Problem. Ich hab mir ein Programm geschrieben welches einen weiteren Thread startet und dort eine Berechnung durchführt. Wenn die Zahl berechnet ist soll der zweite Thread eine Meldung ausgeben - mit ShowMessage(). Das tut er aber nur wenn ich in meinem Programm eine Ausgabe, ShowMessage o.ä., tätige. Diese Ausgabe muss vor dem Aufruf von Resume erfolgen. Sonst erhalte ich wieder keine Meldung vom Unterthread. Programmablauf: // ... // ... im hauptthread - unit1 // try NewThread := MyThread.Create(true); NewThread.FreeOnTerminate := false; NewThread.SetZahl(StrToInt(Edit1.Text)); ShowMessage('Zahl gesetzt'); [COLOR="Red"]<--[/COLOR] NewThread.Resume; except on E:Exception do begin ShowMessage(E.Message); NewThread.Free; end; end; // ... im Unterthread - unit2 // procedure MyThread.Execute(); begin // ... Berechnung // // zahl ist als private deklariert und wir von setzahl gesetzt ShowMessage(IntToStr(Zahl)); end; Danke schon mal für eure Unterstützung. Mit Google hab ich nichts brauchbares gefunden was mein Problem beheben könnte Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 15. Februar 2006 Teilen Geschrieben 15. Februar 2006 Ich denke, die GUI-ausgabe in deinem Thread ist das Problem. Ein Thread ist eben kein eigenständiges Programm. Wenn du es so machst, musst du wohl die Methode synchronize verwenden: Beispiel aus der Delphi Hilfe: Dieses Beispiel zeigt, wie die Methode Click einer Schaltfläche Thread-sicher aufgerufen werden kann: procedure TMyThread.PushTheButton; begin Button1.Click(); end; procedure TMyThread.Execute; begin ... Synchronize(PushTheButton); ... end; Oder aber, du lässt den Thread nur die Berechnung ausführen, alles mit der GUI aber den Hauptthread machen. Dazu gibt es das Event OnTerminate, welches beim Beenden des threads aufgerufen wird, so ungefähr: // ... // ... im hauptthread - unit1 // try NewThread := MyThread.Create(true); NewThread.FreeOnTerminate := [b][COLOR="Red"]True[/COLOR][/b]; [COLOR="Red"]NewThread.Zahl:= StrToInt(Edit1.Text);[/COLOR] [B][COLOR="Red"]NewThread.OnTerminate:= ThreadTerminate;[/COLOR][/B] NewThread.Resume; except on E:Exception do begin ShowMessage(E.Message); NewThread.Free; end; end; [b] [COLOR="Red"]procedure TForm1.ThreadTerminate(Sender: TObject); begin ShowMessage(IntToStr(NewThread.Zahl)); end;[/COLOR] [/b] // ... im Unterthread - unit2 // [b] [COLOR="Red"]//TMyThread ... private FZahl: Integer; procedure setZahl(aZahl: Integer); Function getZahl: Integer; ... public property Zahl: Integer read getZahl write setZahl; ... end; procedure TMyThread.setZahl(aZahl: Integer); begin FZahl:= aZahl; end; function TMyThread.getZahl: Integer; begin result:= FZahl; end; [/COLOR] [/b] procedure MyThread.Execute(); begin // ... Berechnung // [B][COLOR="Red"]FZahl:= FZahl * 5 + 3; // als Beispiel[/COLOR][/B] end; EDIT: Wobei ich mir nicht sicher bin, ob FreeOnTerminate True sein muss, bei nochmaligem anschauen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 15. Februar 2006 Autor Teilen Geschrieben 15. Februar 2006 Hallo, danke erstmal für die Ausführliche Antwort, ich muss es noch ausprobieren, denke aber das es mir hilft , dank dir. Wieso kann dann mein Thread eine Meldung ausgeben wenn im Hauptprogramm auch eine Ausgabe war? Was ändert sich an meine Thread wenn ich zuvor ShowMessage ausgeführt habe? Eigentlich doch nichts oder? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 15. Februar 2006 Teilen Geschrieben 15. Februar 2006 Wieso kann dann mein Thread eine Meldung ausgeben wenn im Hauptprogramm auch eine Ausgabe war? Was ändert sich an meine Thread wenn ich zuvor ShowMessage ausgeführt habe? Eigentlich doch nichts oder? Nein, am Thread ändert sich nichts, aber am (VCL-)Hauptthread. Denke mal (hab auch danach gesucht aber nichts detailiertes gefunden), dass hat mit der Nachrichtenabarbeitung zu tun. wie in der Hilfe zu TThread beschrieben. Wenn du direkt einen API-Aufruf verwendest zum Anzeigen, könnte es vielleicht gehen, weiß ich aber jetzt aber nicht auswendig. Threads sollten aber mit der GUI nix zu tun haben (Ausnahmen wie z.B. ein Thread für eine 3D-Anim o.ä. auf der GUI sind was anderes). Die Oberfläche sollte nur aus dem Hauptprogramm gemanagt werden. Macht das ganze IMHO auch wartungsfreundlicher. Ach ja, wenn du synchonize verwendest (zumindest wenn es häufig aufgerufen wird), kannst du auch gleich auf den Thread verzichten, denn der wartet dann ja immer auf den Hauptthread Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maulwurf_der_Schlaue Geschrieben 15. Februar 2006 Autor Teilen Geschrieben 15. Februar 2006 Hallo, danke für die HIlfe, ist mir mittlerweile auch aufgefallen das der Thread den man erzeugt, wirklich nur ein 'Worker' sein sollte, der halt hin und wieder, wenn es erforderlich ist, sich bei Hauptthread meldet. Werd's einfach mal versuchen, jetzt wo ich genug weiß , ob meine Anwendung einen Vorteil hat. Wenn nur ein weiterer Thread offen ist. Was halt schon mal schön ist, ist das die Anwendung flüssig wirkt, das Fenster ruckelt nicht wenn er in der Bearbeitungsphase steckt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.