Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy10 IdTCPServer Problem (https://www.delphipraxis.net/123800-indy10-idtcpserver-problem.html)

ASKtec 9. Nov 2008 15:43

Re: Indy10 IdTCPServer Problem
 
Hmm, eigentlich sollen sich mal später zwischen 20 und 30 Clients verbinden können ohne dass es Probleme gibt...

Wie benutze ich denn die gleiche CriticalSection nochmal? Einfach zu Beginn und am Ende ein Enter und ein Leave aufrufen?

@omata
Welches Log-Objekt meinst Du? Das Memo oder das Logfile das ich jetzt eingebaut habe?

Wie komme ich denn nun weiter um das ganze stabil zum laufen zu bekommen?

Danke nochmal und viele Grüße
Andreas

omata 9. Nov 2008 15:46

Re: Indy10 IdTCPServer Problem
 
Zitat:

Zitat von ASKtec
Wie benutze ich denn die gleiche CriticalSection nochmal? Einfach zu Beginn und am Ende ein Enter und ein Leave aufrufen?

ja

Zitat:

Zitat von ASKtec
@omata
Welches Log-Objekt meinst Du? Das Memo oder das Logfile das ich jetzt eingebaut habe?

Das Objekt, das "Log" heisst, das ist doch auch schon im ersten Post zu sehen.

ASKtec 9. Nov 2008 15:54

Re: Indy10 IdTCPServer Problem
 
ok, wäre es dann vielleicht sinnvoll immer zu Beginn des Serverevents die CriticalSection zu beginnen und damit die anderen Threads warten zu lassen???

Oder bringt das wieder andere Probleme?

omata 9. Nov 2008 16:06

Re: Indy10 IdTCPServer Problem
 
Ja entweder so, oder die schützt deinen Zugriff jeweils einzeln, damit nicht immer alle überall ausgesperrt werden.
Bau also einen Wrapper für das Log und schütze die Zugriffe auf dieses mit einem Kristischen Abschnitt und den Zugriff auf deine visuelle Komponente schützt du dann mit einem anderen Kritischen Abschnitt.

Win32.API 9. Nov 2008 16:58

Re: Indy10 IdTCPServer Problem
 
Zitat:

Zitat von omata
Die VCL ist nicht Threadsicher, benutze deshalb Kritische Abschnitte.

Delphi-Quellcode:
uses ..., SyncObjs;

type
  :
  private
    { Private-Deklarationen }
    FCriticalSection:TCriticalSection;
  :
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCriticalSection:=TCriticalSection.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FCriticalSection.free;
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
:
begin
  :
  FCriticalSection.Enter;
  try
    ListView1.Clear;
    List := IdTCPServer1.Contexts.LockList;
    for i := 0 to List.Count - 1 do begin
      TidContext(List.Items[i]).Connection.IOHandler.WriteLn(text);
      with Listview1.Items.Add do
        caption := TIdContext(List.Items[i]).Connection.Socket.Binding.PeerIP;
    end;
    IdTCPServer1.Contexts.UnlockList;
  finally
    FCriticalSection.Leave;
  end;
end;


Ist so auch nicht richtig, du _darfst_ nur aus dem Mainthread auf Elemenate der VCL zugreifen. Das geht mittels Synchronize.

Win32.API

omata 9. Nov 2008 17:04

Re: Indy10 IdTCPServer Problem
 
Zitat:

Zitat von Win32.API
Ist so auch nicht richtig, du _darfst_ nur aus dem Mainthread auf Elemenate der VCL zugreifen. Das geht mittels Synchronize.

Und wie willst du dann an die Informationen aus AContext rankommen?

ASKtec 9. Nov 2008 19:47

Re: Indy10 IdTCPServer Problem
 
Hallo,

so wie es im Moment aussieht habe ich es nun geschafft dass es funktioniert. Ich habe für das schreiben der Logdatei eine Prozedur angelegt und dort eine eigene CriticalSection am Anfang und am Ende eingefügt.

Im OnExecute schaue ich dann erst nach dem Kommando. Dann kapsele ich beim richtigen Kommando in einer eigenen CriticalSection den weiteren Ablauf.

Zum testen habe ich eben mal einen Art Chatclient mit einem Timer, der jede Sekunde eine Zufallsnachricht an den Server schickt, programmiert und davon mal 10 Stück auf den Server losgelassen. Dabei ist nichts aus dem Ruder gelaufen.

Nun habe ich den Server da laufen wo er hin soll... in ca. 1 Stunde weiß ich dann mehr.

Gruß und Danke an alle die mir hier geholfen haben :cheers:

Andreas

Win32.API 9. Nov 2008 21:26

Re: Indy10 IdTCPServer Problem
 
Zitat:

Zitat von omata
Zitat:

Zitat von Win32.API
Ist so auch nicht richtig, du _darfst_ nur aus dem Mainthread auf Elemenate der VCL zugreifen. Das geht mittels Synchronize.

Und wie willst du dann an die Informationen aus AContext rankommen?


Wie schon gesagt: Mit Synchronize kann man eine Funktion im Kontext des Mainthreads ausfuehren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 Uhr.
Seite 2 von 2     12   

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