Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Daten aus Thread an Anwendung übergeben (https://www.delphipraxis.net/124924-daten-aus-thread-anwendung-uebergeben.html)

moelski 27. Nov 2008 11:17


Daten aus Thread an Anwendung übergeben
 
Moin !

Ich habe da gerade folgendes Konstrukt:
Delphi-Quellcode:
procedure TPipeServer.Execute;
var
  I, Written: Cardinal;
  InMsg, OutMsg: RPIPEMessage;
begin
  while not Terminated do
  begin
    if FHandle = INVALID_HANDLE_VALUE then
    begin
      // suspend thread for 250 milliseconds and try again
      Sleep(250);
    end else begin
      if ConnectNamedPipe(FHandle, nil) then
      try
        // read data from pipe
        InMsg.Size := SizeOf(InMsg);
        ReadFile(FHandle, InMsg, InMsg.Size, InMsg.Size, nil);
        if
          (InMsg.Kind = 0) and
          (StrPas(InMsg.Data) = cShutDownMsg + FPipeName)
        then
        begin
          // process shut down
          OutMsg.Kind := 0;
          OutMsg.Count := 3;
          OutMsg.Data := 'OK'#0;
          Terminate;
        end else begin
          // data send to pipe should be processed here
          OutMsg := InMsg;
          // we'll just reverse the data sent, byte-by-byte
          Data := InMsg.Data;
          MainForm.ProcessCommand(Data);
          //for I := 0 to Pred(InMsg.Count) do
          //  OutMsg.Data[Pred(InMsg.Count) - I] := InMsg.Data[I];
          OutMsg.Data := 'OK';
        end;
        CalcMsgSize(OutMsg);
        WriteFile(FHandle, OutMsg, OutMsg.Size, Written, nil);
      finally
        DisconnectNamedPipe(FHandle);
      end;
    end;
  end;
end;
Das ist ein Teil der Pipe Demo von hier: http://www.delphi3000.com/articles/article_2918.asp?SK=

Das funzt auch alles ganz prächtig und auch die Pipe klappt. Aber wie kriege ich jetzt die Daten die ich per Pipe gesendet habe in meine Hauptanwendung?

Im Code gibt es die Stelle "Data := InMsg.Data;". Data ist mal nur ein String.
So ich steck da aber noch mitten in dem Thread drin. Wenn ich nun die Daten an meine Hauptanwendung übergeben lasse (mittels MainForm.ProcessCommand(Data); ) und dort z.B. versuche ein MDI Child zu erzeugen, dann hängt die Anwendung.
Hintergrund: Ich will über die Pipe Commands senden können welche dann in der Hauptanwendung bestimmte Reaktionen hervorufen.

Kann mir jemand nen Tip geben wie ich nun die Daten aus dem Thread in meine Hauptanwendung bekomme und die dort verarbeiten kann?

sirius 27. Nov 2008 13:32

Re: Daten aus Thread an Anwendung übergeben
 
  1. Terminate solltest/brauchst du nicht im Thread aufrufen. Ein Exit reicht hier auch bzw. einfach die Methode Execute beenden.
  2. Das Kommando Mainform.Processcommand legst du in eine extra Methode (ohne Parameter) und rufst dann synchronize(Methode) in execute auf.

moelski 27. Nov 2008 14:06

Re: Daten aus Thread an Anwendung übergeben
 
Danke nun tut das so wie ich es haben wollte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 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