AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nachrichten an Thread senden

Ein Thema von R2009 · begonnen am 21. Jan 2010 · letzter Beitrag vom 21. Jan 2010
Antwort Antwort
Seite 1 von 2  1 2      
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#1

Nachrichten an Thread senden

  Alt 21. Jan 2010, 05:26
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Nachrichten an Thread senden

  Alt 21. Jan 2010, 05:56
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Nachrichten an Thread senden

  Alt 21. Jan 2010, 06:03
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Nachrichten an Thread senden

  Alt 21. Jan 2010, 06:11
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Nachrichten an Thread senden

  Alt 21. Jan 2010, 06:15
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Nachrichten an Thread senden

  Alt 21. Jan 2010, 06:25
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Nachrichten an Thread senden

  Alt 21. Jan 2010, 07:28
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Nachrichten an Thread senden

  Alt 21. Jan 2010, 07:32
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Nachrichten an Thread senden

  Alt 21. Jan 2010, 07:35
@Sir: Er probiert ja jedesmal beides aus
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Nachrichten an Thread senden

  Alt 21. Jan 2010, 07:55
Hi Sirius,

ich bin doch ein Rind....

Zitat:
Achnee, PostThreadMEssage benötigt ja nicht das Handle, sondern die ID des Threads.
  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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.
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