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...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!