Entwickler-Ecke

Windows API - Im Thread Ereignisse abschicken


gunman - Mi 02.10.02 12:39
Titel: Im Thread Ereignisse abschicken
Hallo Leudz,

ich arbeite gerade an einer Konsolenanwendung (nonvcl logischerweise:.)) die aus einem Mainthread und einem Nebenthread besteht. Der Nebenthread wurde mit der API Funktion CreateThread erzeugt. Wie kriege ich es hin das ich aus diesem Thread Ereignisse an den Mainthread schicken kann.
Problem ist dabei auch noch meine Unit-Aufteilung. Das heist der Haupteil meines Codes benutzt die ThreadUnit aber nicht umgekehrt.
Muss ich dafür API Code benutzen oder gibt es noch einen eleganteren Weg über Delphi :?: :?: :?:


OregonGhost - Sa 05.10.02 17:57

Du kannst mit SetEvent() einen Event (= Ereignis (c; ) auslösen, den der andere Thread mit WaitForSingleObject() jederzeit abfragen kann.


Jakob Schöttl - Fr 06.04.07 11:17

Hierzu noch eine kleine Frage, nachträglich:

Kann ich in einer, von TThread abgeleiteten Klasse, Ereignisse deklarieren und auslösen?
Und kann dann der HauptThread, also die Anwendung eine Ereignisbehandlungsroutine bereitstellen?


Narses - Fr 06.04.07 11:20

Moin1

TThread hat doch dafür Synchronize(). ;)

cu
Narses


Gausi - Fr 06.04.07 11:24

Sendmessage/Postmessage von einem Thread an ein Fenster sind kein Problem.


Jakob Schöttl - Fr 06.04.07 11:26

Ich hätte aber gern, dass der Programmierer, der meinen Thread benutzt sich selbst überlegen kann, ob er ein Ereignis implementiert, oder nicht. Geht das also so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  TLeseThread = class(TThread)
  private   
    FOnInitFailed: TNotifyEvent;
  protected
    procedure Execute; override;
  public
    property OnInitFailed: TNotifyEvent read FOnInitFailed write FOnInitFailed;    
  end;


... und in Execute:

Delphi-Quelltext
1:
if Assigned(FOnInitFailed) then FOnInitFailed(Sender);                    


? Danke schon mal!


Narses - Fr 06.04.07 11:28

Moin!

Ja, so etwa kann man das machen. Du mußt dir dann nur noch überlegen, ob du das Ereignis VCL-synchron ausführen willst (dann noch mit Synchronize() kapseln) oder nicht (wie es jetzt ist -> im Thread-Kontext nämlich -> keine VCL!).

cu
Narses


Jakob Schöttl - Fr 06.04.07 11:33

Gut, danke Narses.

Aber noch eins, ich kann ja eine Methode mit Parametern nicht mit Synchronize kapseln, sondern nur welche ohne Parametern.

Synchronize(FOnInitFailed(Self)); da kommt ein Compiler-Fehler.


Gausi - Fr 06.04.07 11:47

Dann kannst du sowas machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
//...
fMyParam := Whatever;
Synchronize(MeinEventProc);
//...

procedure TMyThread.MeinEventProc;
begin
  if Assigned(FOnInitFailed) then FOnInitFailed(fMyParam);
end;


Jakob Schöttl - Fr 06.04.07 11:50

ja, daran hab ich auch schon gedacht. Naja Danke euch zwei...