Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   NotificationCenter in Indy TCP Client Server Thread marshalled (https://www.delphipraxis.net/215349-notificationcenter-indy-tcp-client-server-thread-marshalled.html)

Ykcim 18. Jun 2024 09:59

NotificationCenter in Indy TCP Client Server Thread marshalled
 
Hallo Zusammen,

ich habe meinen ersten Versuch mit einer Indy TCP Client Server App gemacht. Durch eine Anleitung ist das auch gelungen. Jetzt wollte ich eine Notification Nachricht hinzufügen, dass wenn der Server an die Clients etwas schickt, dass es in Windows angezeigt wird.

Dazu verwende ich folgende Procedure:
Delphi-Quellcode:
procedure TFClient.ShowMessageInWindows(msgTitel, msgFromServer: string);
var  MyNotification: TNotification;
begin
   MyNotification := NtfctnCntr.CreateNotification;
   Try
      MyNotification.Title := msgTitel;
      MyNotification.AlertBody := msgFromServer;
      NtfctnCntr.PresentNotification(MyNotification);
   Finally
      MyNotification.Free;
   End;
end;
Wenn ich diese in einer TestApp ausführe, bekomme ich die Message in Windows angezeigt, wie gewünscht. Wenn ich diese Procedure aber in der Indy TCP Client App ausführe, bekomme ich folgende Fehlermeldung:
Zitat:

Eine Schnittstelle, die für einen anderen Thread marshalled war, wurde von der Anwendung aufgerufen.
In dem Client sieht das Ganze so aus:
Delphi-Quellcode:
procedure TFClient.IdThreadComponentRun(Sender: TIdThreadComponent);
var  msgFromServer : string;
begin
    // ... read message from server
    msgFromServer := IdTCPClient.IOHandler.ReadLn();
    // ... messages log
    Display('SERVER', msgFromServer);
    // ... Show Message in Windows Messages
    ShowMessageInWindows('Server Message', msgFromServer);
    // ... AutoDisconnect
    if msgFromServer = 'Goodbye Client ' then begin
      btn_disconnectClick(nil);
    end;
end;
Delphi-Quellcode:
procedure TFClient.Display(p_sender : String; p_message : string);
begin
  TThread.Queue(nil, procedure
                     begin
                         MessagesLog.Lines.Add('[' + p_sender + '] - '
                         + GetNow() + ': ' + p_message);
                     end
               );
end;
Kann mir jemand sagen, wo die Ursache liegt, denn ich bin im Umgang mit Threads noch nicht sehr erfahren...

Vielen Dank
Patrick

peterbelow 18. Jun 2024 11:22

AW: NotificationCenter in Indy TCP Client Server Thread marshalled
 
Der Indy Client benutzt einen sekundären Thread. Ruf die ShowMessageInWindows-Methode nicht direkt sondern per TThread.Queue oder TThread.Synchronize auf damit sie im Kontext des Hauptthreads ausgeführt wird.

Ykcim 18. Jun 2024 15:04

AW: NotificationCenter in Indy TCP Client Server Thread marshalled
 
Hallo peterbelow,

vielen Dank! So funktioniert es ohne Probleme!

Delphi-Quellcode:
procedure TFClient.IdThreadComponentRun(Sender: TIdThreadComponent);
var  msgFromServer : string;
begin
    // ... read message from server
    msgFromServer := IdTCPClient.IOHandler.ReadLn();
    // ... messages log
    Display('SERVER', msgFromServer);
    // ... Show Message in Windows Messages
    TThread.Queue(nil, procedure
                       begin
                         ShowMessageInWindows('Server Message', msgFromServer);
                       end);
    // ... AutoDisconnect
    if msgFromServer = 'Goodbye Client ' then begin
      btn_disconnectClick(nil);
    end;
end;
Vielen Dank!

Patrick


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