![]() |
Nachrichten an Thread senden
Hi,
wir nutzen SendMessage( statethread.Handle, SET_INTERTHREAD_TRA,1, 0 ); und GetMessages(var msg: Tmessage); message SET_INTERTHREAD_TRA; um zwischen einzelnen Programmteilen zu kommunizieren und Nachrichten auszutauschen. Das funktioniert ganz hervorragend. Problem: Bei einem Thread kann man zwar aus dem Thread heraus eine Nachricht abzusetzen aber in den Thread hinein funktioniert das nicht auf die übliche Weise. Wie kann ich dem Thread beibringen, dass er wie üblich auf sendmessage reagiert?
Delphi-Quellcode:
Die Beiträge hier im Forum habe ich nicht verstanden und auch nicht nachvollziehen können.
procedure GetMessages(var msg: Tmessage); message SET_INTERTHREAD_TRA;
......... procedure Tstatethread.GetMessages(var msg: Tmessage); var a:string; begin if msg.msg = SET_INTERTHREAD_TRA then begin .... tu irgendetwas end; end; Mir ist völlig unklar wie man mit PostThreadMessage gesendete Nachrichten, im Thread, abfängt. Grüsse Rainer |
Re: Nachrichten an Thread senden
wenn du mit PostThreadMEssage nachrichten abschickst, musst du sie im Thread auch empfangen. Dazu gibt es die Funktionen GetMessage und Peekmessage (erstere ist blockierend).
Damit bekommst du deine Nachricht in in einem TMsg-record. Die könntest du jetzt direkt auswerten oder in ein TMEssage-Record umkopieren und mittels der Methode (TObject.)Dispatch an deine Methode GetMessages o.a. verteilen. |
Re: Nachrichten an Thread senden
Hi Sirius,
hab ich probliert mit:
Delphi-Quellcode:
Mal ganz davon abgesehen, dass ich im Moment noch nicht weiss wie man die Message abfängt, müsste.... while (bRunning = true) do begin while getMessage(msg,0,0,0) do //warten auf Message begin DispatchMessage(msg); end; application.ProcessMessages; end; doch irgendwann mal Dispatchmessage aufgerufen werden. habs mit diesen beiden Aufrufen probiert. Funktioniert nicht. Oder versteh ich da was nicht richtig?
Delphi-Quellcode:
Grüsse
PostMessage( statethread.Handle, SET_INTERTHREAD_TRA,1, 0 );
//PostThreadMessage( statethread.handle, SET_INTERTHREAD_TRA,1, 0 ); Rainer |
Re: Nachrichten an Thread senden
Also 1. das Application.PRocessMEssages kommt aus dem Thread raus. Das ist ja ganz böse.
Und 2. PostThreadMessage sollte so funktionieren. Allerdings bringt DispatchMessage nix, da du ja nicht an ein Fenster sendest (was man auch machen kann, aber dazu muss man im Thread ein Fenster erstellen: allocatehwnd) sondern an den Thread. Versuch doch am einfachsten, die Messagfe vorerst gleich an ort und Stelle auszuwerten (Also anstatt DispatchMessage). Verteilen kannst du die MEssage hier nur mit Dispatch. |
Re: Nachrichten an Thread senden
Hi Sirius,
ja ja application.processmessages muss raus. Ist mir klar.
Delphi-Quellcode:
Natürlich kann ich die Messages selbst verteilen, ich muss aber erst mal dahin kommen.
while (bRunning = true) do
begin if peekMessage(msg,0,0,0,0) then //warten auf Message begin DispatchMessage(msg); //<----------------------------------- hier komm ich nie an end; end; Dispatchmasseges erreiche ich nie. Grüsse Rainer |
Re: Nachrichten an Thread senden
Hi,
vielleicht kann mir jemand sagen wo mein Fehler liegt. Hier wird der Thread erzeugt und die Botschaft gesandt:
Delphi-Quellcode:
Der Thread:
SET_INTERTHREAD_TRA = WM_USER+12;
.... procedure TForm1.Button1Click(Sender: TObject); //<--------------damit erzeuge ich den thread begin statethread := TStateThread.Create(True); statethread.FreeOnTerminate := True; statethread.call_handle:=statethread.Handle; statethread.Resume; end; procedure TForm1.Button3Click(Sender: TObject);//<-------------------damit sende ich eine Botschaft begin PostMessage( statethread.Handle, SET_INTERTHREAD_TRA,1, 0 ); //PostThreadMessage( statethread.handle, SET_INTERTHREAD_TRA,1, 0 ); end;
Delphi-Quellcode:
Ich weiss, dass die Art den Thread zu stoppen nicht optimal ist aber darum geht es nicht.
unit Ustatethread;
interface uses //Classes, control_def, Messages, Ucomthread; windows, classes, sysutils, extctrls, forms, OoMisc, AdPort, control_def, U_hexa, strutils, Ucomthread, Messages,dialogs; type Tstatethread = class(TThread) private { Private-Deklarationen } bRunning:boolean; public call_handle:HWND; procedure stop; protected procedure Execute; override; end; implementation //*************************************************************************** //Name: stop; //Designed by: Rainer Unger 2010 //Procedure/Function: stop thread //Input: none //Output: destroyed thread //Revision: Initial 20.01.2010 //*************************************************************************** procedure Tstatethread.stop; begin brunning:=false; end; procedure Tstatethread.Execute; var a:string;msg:Tmsg; begin bRunning:=true; while (bRunning = true) do begin if peekMessage(msg,0,0,0,0) then //warten auf Message begin DispatchMessage(msg); //<----------------------hier müsste ich eigentlich irgenwann mal ankommen. Hab Breakpoint gesetzt. end; end; end; end. Grüsse Rainer |
Re: Nachrichten an Thread senden
Hast du mal geschaut, ob dein Handle <>0 ist?
Edit1: Achnee, PostThreadMEssage benötigt ja nicht das Handle, sondern die ID des Threads.
Code:
Edit2: Und du brauchst dir das Handle oder dann die ThreadID nicht extra merken.
BOOL PostThreadMessage(
DWORD idThread, // thread identifier UINT Msg, // message to post WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); |
Re: Nachrichten an Thread senden
der Fehler ist das du PostMessage anstelle PostThreadMessage verwendest.
Mit PostMessage und SendMessage kann man an ein Fenster Nachrichten senden (dazu muss das Fensterhandle angegeben werden). Hat man hingegen kein Fenster sondern will eine Nachricht direkt an einen Thread schicken muss man PostThreadMessage verwenden. |
Re: Nachrichten an Thread senden
@Sir: Er probiert ja jedesmal beides aus ;)
|
Re: Nachrichten an Thread senden
Hi Sirius,
ich bin doch ein Rind.... Zitat:
Delphi-Quellcode:
Damit funktioniert das ganze jetzt.
PostThreadMessage( statethread.ThreadID, SET_INTERTHREAD_TRA,1, 0 );
das handle brauch ich später für andere Dinge noch. Ich werde später mein ganzes Konzept hier in der DP kommunizieren, dann kannst du sehen warum. Grüsse Rainer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz