![]() |
Strings per PostMessage intern weitergeben?
Hallo,
Ich komme einfach nicht weiter! :cry: Ich habe einen Thread den ich vom Hauptprogramm Nachrichten schicken will. Derzeit habe ich es so gemacht, dass der Hauptthread per Postmessage den Thread die Nachrichten schickt. Der Thread hat mit AllocateHwnd sein eigenes Hwnd. Nun möchte ich aber auch Strings zu dem Thread schicken. Hätte versucht eine TStringList zu erstellen und dann den Pointer per Wparam zu übergeben. Komm aber nicht weiter! Geht das vielleicht auch viel einfacher? Finde hier im Board leider keine Lösung. Danke! |
Re: Strings per PostMessage intern weitergeben?
Beispielsweise so?
Delphi-Quellcode:
const
WM_StrRcv = WM_USER + 1; {...} { Public-Deklarationen } procedure OnStrRcv(var Msg: TMessage); message WM_StrRcv; {...} procedure TForm1.Button1Click(Sender: TObject); var pStr: PString; begin New( pStr ); pStr^ := Edit1.Text; PostMessage( Handle, WM_StrRcv, DWord(pStr), 0 ); end; procedure TForm1.OnStrRcv(var Msg: TMessage); var pStr: PString; begin pStr := PString( Msg.WParam ); Memo1.Lines.Add( pStr^ ); Dispose( pStr ); end; |
Re: Strings per PostMessage intern weitergeben?
Schau dir mal die Windows-Message WM_COPYDATA an. Hier im Forum solltest du genug Beispiele finden.
|
Re: Strings per PostMessage intern weitergeben?
Da die Nachricht nicht über Prozessgrenzen verschickt werden sollen, wird auch kein WM_COPYDATA benötigt. Aber warum arbeitest du mit einem AllocateHwnd[i]? Benutze doch
![]() |
Re: Strings per PostMessage intern weitergeben?
Danke für eure Hilfe!
Werde mir das mit PostThreadMessage noch ansehen. Ich habe es derweilen so gelößt: Hauptform gibt dem Thread die Nachricht das eine Stringlist abzuholen ist. Da holt sich der Thread über Synchronize die TStringlist von der Hauptform ab. Geht soweit ganz gut! EDIT: Habe mir nun PostThreadMessage angesehen. Mein Thread erhält auch die Nachrichten. Im Thread habe ich eine Dauerschleife mit while not Terminated In dieser Schleife werte ich so die Nachrichten aus:
Delphi-Quellcode:
Nun habe ich das Problem, das meine Nachricht Msg.message zwei mal ansteht.
while not Terminated do
begin if MyIdTCPClient.Connected then begin Sleep(10); //check first if message got received from mainform: Peekmessage(Msg, 0, 0, 0, PM_REMOVE); TranslateMessage(Msg); DispatchMessage(Msg); case Msg.message of ... .. Wenn ich im Case Msg.message nach erhalt der Nachricht Msg.message := 0 setze geht es. Warum bekomme ich die Message zwei mal? |
Re: Strings per PostMessage intern weitergeben?
LAss mal das Translate und Dispatchmessaqeg weg, wenn du jetzt sowieso keine Fenster mehr hast.
|
Re: Strings per PostMessage intern weitergeben?
Delphi-Quellcode:
Behebt leider das Problem nicht das sie zwei mal kommt!?
//TranslateMessage(Msg);
//DispatchMessage(Msg); case Msg.message of Nur wenn ich es so mache geht es:
Delphi-Quellcode:
//TranslateMessage(Msg);
//DispatchMessage(Msg); case Msg.message of MyMessage : Msg.message := 0; |
Re: Strings per PostMessage intern weitergeben?
Das ist komisch., ich habe erst kürzlich hier ein BEispiel gepostet, was einwandfrei funktioniert (mit PostThreadMEssage)
Wo kommt eigentlich der TCPClient her? Ist der Teil des Threads? (evtl. braucht der Client doch min. ein Dispatchmessage) |
Re: Strings per PostMessage intern weitergeben?
Die MeinForm schickt es so:
Delphi-Quellcode:
Der Thread empfängt sie dann so:
function TFormClient.SendMessageToThread(const Command : Byte) : Boolean;
begin if Assigned(ThreadTCPClient) then begin if ThreadTCPClient.ThreadID <> 0 then Result := PostThreadMessage(ThreadTCPClient.ThreadID, SendCommandToServer, 0,Command) end; end;
Delphi-Quellcode:
So geht es, aber wenn ich das Msg.message := 0; rausnehme dann bekomme ich die Meldung 2 mal.
MyIdTCPClient := TIdTCPClient.Create(nil);
while not Terminated do begin if MyIdTCPClient.Connected then begin Sleep(1); //check first if message got received from mainform: Peekmessage(Msg, 0, 0, 0, PM_REMOVE); case Msg.message of SendCommandToServer : begin Msg.message := 0; end; //SendCommandToServer : begin end; //case Msg.message of if not MyIdTCPClient.IOHandler.InputBufferIsEmpty then begin //schau was im Inputpuffer vom Client ist end; end else begin MyIdTCPClient.Connect; if MyIdTCPClient.Connected then fServerConnectionStatus := Connected; end; |
Re: Strings per PostMessage intern weitergeben?
Peekmessage ist ja nicht blockierend. Wenn beim zweiten Durchlauf keine neue Message anliegt, kommt peekmessage zurück ohne den Record MSg geändert zu haben. Du musst den Rückegabewert von Peekemessage überprüfen, ob überhaupt eine neue Message da ist/war.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 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