Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Delphi 6] Threads verwenden

Empfohlene Antworten

Veröffentlicht

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

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

  • Autor

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?

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

  • Autor

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.