Zum Inhalt springen

[Delphi 6] Threads verwenden


Empfohlene Beiträge

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 :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...