Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Nachricht kommt nicht bei allen Clients an (https://www.delphipraxis.net/12585-nachricht-kommt-nicht-bei-allen-clients.html)

Spurius 30. Nov 2003 14:01


Nachricht kommt nicht bei allen Clients an
 
Hallo,
ich habe einen Chat programmiert und habe jetzt das Problem, dass wenn ein Client eine Nachricht an den Server schickt, diese zwar beim Server ankommt, aber der Server diese nicht an alle Clients zurückschickt, sondern nur an der Client, der die Nachricht geschickt hat.
Mein Code für das Schicken der Nachricht sieht so aus:
Delphi-Quellcode:
procedure TForm1.serverExecute(AThread: TIdPeerThread);
var post: string;
begin
  post := athread.connection.readln;
  memo2.Lines.Add(post);
  athread.Connection.WriteLn(post);
end;
Gruß
Spurius

Kamil 30. Nov 2003 15:48

Re: Nachricht kommt nicht bei allen Clients an
 
Hi,
das OnExecute Ereignis wird in einem extra Thread ausgeführt, deshalb ist es gefährlich auf VCL Komponenten zuzugreifen (memo2.Lines.Add(post)). Verwende dazu AThread.Synchronize.

AThread.Connection steht für Verbindung des einen Threads und nicht für alle Verbindungen.
In der IdTCPServer1.Threads TThreadList sind alle Threads des Severs.

Spurius 30. Nov 2003 18:08

Re: Nachricht kommt nicht bei allen Clients an
 
Hallo,
das ich dem Memo vom Server Strings hinzufüge geht, aber ich verstehe nicht, wie ich auf die threadlist zugreifen kann :?:

Eigentlich müsste das ja so aussehen

server.threads.writeln(...);

Wie muss ich das denn machen?

Gruß
Spurius

Kamil 30. Nov 2003 18:23

Re: Nachricht kommt nicht bei allen Clients an
 
Zitat:

Zitat von Spurius
Hallo,
das ich dem Memo vom Server Strings hinzufüge geht,

solange nur ein Thread auf das Memo zugreift...
Zitat:

Zitat von Spurius
aber ich verstehe nicht, wie ich auf die threadlist zugreifen kann :?:
Eigentlich müsste das ja so aussehen
server.threads.writeln(...);
Wie muss ich das denn machen?

Delphi OH -> TThreadList

Spurius 30. Nov 2003 19:00

Re: Nachricht kommt nicht bei allen Clients an
 
Ok,
ich hab in der Hilfe nachgeschaut und gesehen, dass man die threadlist erst locken muss.
aber wie sieht konkret der code aus, um mit allen threads aus der liste etwas zusenden?
Das muss ja irgendeine Schleife sein.
Gruß
Spurius

Kamil 30. Nov 2003 19:05

Re: Nachricht kommt nicht bei allen Clients an
 
Du lockst die Liste und bekommst eine TList. Wie eine TList funktioniert weißt du, oder?

Ungefähr so wird's gehen:
Delphi-Quellcode:
myList:=Server.Threads.Lock;
try
  for i:=0 to myList.Count-1 do
    TIdThread(myList.Items[i]).Connection.WasWeißIch(...
finally
  Server.Threads.UnLock;
end;

MyRealName 2. Dez 2003 12:09

Re: Nachricht kommt nicht bei allen Clients an
 
:warn: Ich allerdings würde nicht (und mach es nicht) mit zig Threads arbeiten. Stell Dir vor, Du hast 250 Nutzer im Chat.. oder 1000. Weißt Du, was dann mit Deinem Windows passiert ? -> :kotz:

Ich arbeite bei mir auf Arbeit an einem Service, der a) ein Chat-System hat (ähnlich ICQ) und b) noch x beliebig viele andere Services hostet die über TCP kommunizieren (arbeite in einem großen Verlag). Ich komme da mit einem Thread aus. und es läuft wunderbar :dancer:

MyRealName

Spurius 2. Dez 2003 12:44

Re: Nachricht kommt nicht bei allen Clients an
 
Hallo,
der Chat funktioniert jetzt wunderbar.
Nochmal Danke für die viele Hilfe!
Gruß
Spurius


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