Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Nachrichten an Thread senden (https://www.delphipraxis.net/146498-nachrichten-thread-senden.html)

R2009 21. Jan 2010 05:26


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:
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;
Die Beiträge hier im Forum habe ich nicht verstanden und auch nicht nachvollziehen können.
Mir ist völlig unklar wie man mit PostThreadMessage gesendete Nachrichten, im Thread, abfängt.
Grüsse
Rainer

sirius 21. Jan 2010 05:56

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.

R2009 21. Jan 2010 06:03

Re: Nachrichten an Thread senden
 
Hi Sirius,
hab ich probliert mit:

Delphi-Quellcode:
 
....
  while (bRunning = true) do
    begin
    while getMessage(msg,0,0,0) do //warten auf Message
      begin
        DispatchMessage(msg);
      end;
      application.ProcessMessages;
    end;
Mal ganz davon abgesehen, dass ich im Moment noch nicht weiss wie man die Message abfängt, müsste
doch irgendwann mal Dispatchmessage aufgerufen werden.

habs mit diesen beiden Aufrufen probiert. Funktioniert nicht. Oder versteh ich da was nicht richtig?

Delphi-Quellcode:
  PostMessage( statethread.Handle, SET_INTERTHREAD_TRA,1, 0 );
  //PostThreadMessage( statethread.handle, SET_INTERTHREAD_TRA,1, 0 );
Grüsse
Rainer

sirius 21. Jan 2010 06:11

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.

R2009 21. Jan 2010 06:15

Re: Nachrichten an Thread senden
 
Hi Sirius,

ja ja application.processmessages muss raus. Ist mir klar.

Delphi-Quellcode:
  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;
Natürlich kann ich die Messages selbst verteilen, ich muss aber erst mal dahin kommen.
Dispatchmasseges erreiche ich nie.

Grüsse
Rainer

R2009 21. Jan 2010 06:25

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:
  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;
Der Thread:
Delphi-Quellcode:
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.
Ich weiss, dass die Art den Thread zu stoppen nicht optimal ist aber darum geht es nicht.

Grüsse
Rainer

sirius 21. Jan 2010 07:28

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

    DWORD idThread,   // thread identifier
    UINT Msg,   // message to post
    WPARAM wParam,   // first message parameter
    LPARAM lParam    // second message parameter
   );
Edit2: Und du brauchst dir das Handle oder dann die ThreadID nicht extra merken.

SirThornberry 21. Jan 2010 07:32

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.

sirius 21. Jan 2010 07:35

Re: Nachrichten an Thread senden
 
@Sir: Er probiert ja jedesmal beides aus ;)

R2009 21. Jan 2010 07:55

Re: Nachrichten an Thread senden
 
Hi Sirius,

ich bin doch ein Rind....

Zitat:

Achnee, PostThreadMEssage benötigt ja nicht das Handle, sondern die ID des Threads.
Delphi-Quellcode:
  PostThreadMessage( statethread.ThreadID, SET_INTERTHREAD_TRA,1, 0 );
Damit funktioniert das ganze jetzt.

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 22:38 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz