Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - TEvent an GUI Thread schicken


Arne - Do 04.09.14 11:06
Titel: TEvent an GUI Thread schicken
Servus zusammen,

ich nutze D2007 und stehe vor folgendem Problem: ich muss Berechnungen, die Minuten dauern, in einen eigenen Thread auslagern, da sonst die Applikation mit einer AccessViolation auf die Adresse $FEEEFEEE abschmiert. Ich kann mir nur vorstellen, dass die langen Berechnungen im GUI Thread hierzu führen.
Nun möchte ich diese Berechnungen in einen Thread auslagern, der aber irgendwann dem GUI Thread mitteilen muss, dass er fertig ist und die Ergebnisse abgeholt werden können. Der Workerthread sendet nun z.B. ein TEvent.SetEvent. Aber wie kann der GUI Thread darauf lauschen? Eine nicht so tolle Methode wäre einen TTimer zyklisch auf das TEvent lauschen zu lassen. Aber wie macht man es richtig?

thanx, Arne


Sinspin - Do 04.09.14 11:35

Hi,
Du kannst auch mit PostMessage arbeiten und an das Handle deines Fensters eine Nachricht senden. Das einzige was zu beachten ist, ist das der Aufruf Synchron mit dem dem Hauptthread erfolgen muss.


Delphi-Quelltext
1:
2:
3:
4:
5:
Synchronize(
  procedure
  begin
    PostMessage(WindowHandle, MessageType, 00);
  end);


Tastaro - Do 04.09.14 11:40

tevent hat die Methode WaitFor. Damit kann man auf das Setzen des Events warten.


jfheins - Do 04.09.14 18:49

user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Hi,
Du kannst auch mit PostMessage arbeiten und an das Handle deines Fensters eine Nachricht senden. Das einzige was zu beachten ist, ist das der Aufruf Synchron mit dem dem Hauptthread erfolgen muss.

Hä? PostMessage ist eine reine WIn32 API-Funktion, die brauchst du nicht synchronisieren. Ist ja auch irgendwie witzlos, zu warten bis der GUI Thread Zeit hat, nur um dann ein PostMessage zu machen. Da könnte man auch direkt ein SendMessage machen oder direkt im Synchonize eine Funktion der GUI aufrufen.


Sinspin - Do 04.09.14 23:25

Soso, dann habe ich also Heute doch noch was gelernt.