![]() |
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.
|
Re: Strings per PostMessage intern weitergeben?
Zitat:
einem Workerthread, signalled von einem Eventobjekt, aholen zu lassen. Der Thread wartet dann wieder auf das nächtse Event, usw... und so fort. Die Verwendung einer Messagequeue und die Sleeps im IndyClient, haben sich die Indy Entwickler sicher nicht so vorgestellt. Wenn schon sowas, dann eher so.
Delphi-Quellcode:
Die DefProc sieht dann etwa so aus.if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin if Msg.message = WM_QUIT then BREAK; DispatchMessage(msg) end else WaitMessage;
Delphi-Quellcode:
lg. Astatfunction WindowProc(hWnd, msg, WParam, LParam: LongInt): LongInt; stdcall; var p Pointer; begin Result := DefWindowProc(hWnd ,msg, WParam, LParam); if Msg = FOO then begin BAR end; end; |
Re: Strings per PostMessage intern weitergeben?
Hi,
Sirius: Ich nehme an du meinst das Beispiel das du zu meinem Thread gepostest hast. Das hat bei mir, in deiner Fassung, auch nicht funktioniert. Ich kann vor der Verwendung von postthreadmessage nur warnen. Bei uns hier hat das, bei der Kommunikation zwischen Threads und zwischen main, nie zuverlässig funktioniert. Das ganze Handling ist sehr undurchsichtig. Z.B. muß in jedem Thread, in der mainloop, application.processmessages drinstehen. Steht das nicht drin funktioniert das Ganze nicht. Das war auch bei dem Beispiel von Sirius der Fall. Zunmindest auf unseren Rechnern hier und mit RAD2007 ist das so. Ich hab das ganze jetzt mit Events gelöst. Geht auch! Grüsse Rainer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 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