AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Strings per PostMessage intern weitergeben?

Ein Thema von schwa226 · begonnen am 22. Jan 2010 · letzter Beitrag vom 26. Jan 2010
Antwort Antwort
Seite 1 von 2  1 2   
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

Strings per PostMessage intern weitergeben?

  Alt 22. Jan 2010, 18:12
Hallo,

Ich komme einfach nicht weiter!

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!
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Strings per PostMessage intern weitergeben?

  Alt 22. Jan 2010, 20:10
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;
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.023 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Strings per PostMessage intern weitergeben?

  Alt 22. Jan 2010, 22:16
Schau dir mal die Windows-Message WM_COPYDATA an. Hier im Forum solltest du genug Beispiele finden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Strings per PostMessage intern weitergeben?

  Alt 22. Jan 2010, 23:07
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 Delphi-Referenz durchsuchenPostThreadMessage.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#5

Re: Strings per PostMessage intern weitergeben?

  Alt 23. Jan 2010, 10:20
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:
    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
...
..
Nun habe ich das Problem, das meine Nachricht Msg.message zwei mal ansteht.
Wenn ich im Case Msg.message nach erhalt der Nachricht Msg.message := 0 setze geht es.
Warum bekomme ich die Message zwei mal?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: Strings per PostMessage intern weitergeben?

  Alt 23. Jan 2010, 12:40
LAss mal das Translate und Dispatchmessaqeg weg, wenn du jetzt sowieso keine Fenster mehr hast.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#7

Re: Strings per PostMessage intern weitergeben?

  Alt 23. Jan 2010, 12:59
Delphi-Quellcode:
        //TranslateMessage(Msg);
        //DispatchMessage(Msg);

          case Msg.message of
Behebt leider das Problem nicht das sie zwei mal kommt!?

Nur wenn ich es so mache geht es:
Delphi-Quellcode:
        //TranslateMessage(Msg);
        //DispatchMessage(Msg);

          case Msg.message of
             MyMessage : Msg.message := 0;
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: Strings per PostMessage intern weitergeben?

  Alt 23. Jan 2010, 13:53
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)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#9

Re: Strings per PostMessage intern weitergeben?

  Alt 23. Jan 2010, 16:57
Die MeinForm schickt es so:
Delphi-Quellcode:
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;
Der Thread empfängt sie dann so:
Delphi-Quellcode:
  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;
So geht es, aber wenn ich das Msg.message := 0; rausnehme dann bekomme ich die Meldung 2 mal.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: Strings per PostMessage intern weitergeben?

  Alt 25. Jan 2010, 07:51
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 23:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf