2010-12-28 9 views
1

Wenn ich trennen Echo-Client wie:Warum hat der Echo-Server von Indy 10 eine hohe CPU-Auslastung, wenn der Client die Verbindung trennt?

EchoClient1.Disconnect; 

Client trennt fein ... aber Echoserver registrieren nicht einmal Client Trennung und es endet mit einer hohen Prozessnutzung auf!?!?

in jedem Beispiel und jedem Dokument sagt es, dass der Aufruf von EchoClient.Disconnect ausreichend ist!

jemand, eine Idee?

(Ich arbeite in Win7, könnte das ein Problem sein?)

Server Code:

procedure TForm2.EServerConnect(AContext: TIdContext); 
begin 
    SrvMsg.Lines.Add('ECHO Client connected !'); 
end; 

procedure TForm2.EServerDisconnect(AContext: TIdContext); 
begin 
SrvMsg.Lines.Add('ECHO Client disconnected !'); 
end; 

Problem ist "TForm2.EServerDisconnect" führt nie!?!?

+0

Brauchen Sie serverseitigen Code zu erhalten –

+0

nur aktiv zu wahren und einfachen OnConnect und OnDisconnect Verfahren seting ... – EmirZ

Antwort

3

Finden Sie es mit dem Debugger selbst heraus.

Wenn Ihr Programm eine hohe CPU-Auslastung aufweist, gehen Sie davon aus, dass es in einer Schleife stecken bleibt. Der Debugger kann Ihnen helfen herauszufinden, welche Schleife und warum. Während der Server im Debugger ausgeführt wird und das Problem aufweist, drücken Sie die Taste "Pause". Der Debugger unterbricht Ihr Programm und zeigt Ihnen die Zeile an, die Ihr Programm ausgeführt hat. Verwenden Sie die Aufrufliste, um Ihnen zu zeigen, wie Ihr Programm zu dieser Zeile kam. Finde die Schleife, von der du vermutest, dass sie der Schuldige ist. Setzen Sie Ihr Programm noch einige Male fort und pausieren Sie, um zu sehen, ob Sie immer irgendwo in derselben Schleife anhalten. Analysieren Sie jetzt den Code, um herauszufinden, warum die Schleife nicht beendet wird.

Möglicherweise müssen Sie einen anderen Thread aktivieren; Der Haupt-GUI-Thread wird wahrscheinlich in einem Anruf auf GetMessage warten, was normal ist.

Stellen Sie sicher, dass Sie the latest version of Indy verwenden. Verwenden Sie nicht die Version, die mit Ihrer Delphi-Kopie geliefert wurde.

+0

Niemals develompent Schnappschüsse von Indy, seine „Release "Versionen sind instabil genug. –

+3

@User, die einzige auf der Website von Indy verfügbare Version ist sechs Jahre alt. Die Version, die mit Delphi 2010 geliefert wurde [nicht einmal kompiliert] (http://stackoverflow.com/questions/2358111/). Download von SVN. –

+0

Ich habe das alles schon gemacht ... Ich weiß, was das Problem ist, ich weiß einfach nicht, wie ich es lösen soll! Der Server trennt den Client NICHT, auch wenn er nicht verbunden ist! Der Thread des Clients auf dem Server ist niemals heruntergefahren! Es muss ein Fehler irgendeiner Art oder ... sein! – EmirZ

2

Der angezeigte Code ist NICHT GEWINDEFREI. Jedes Indy-Ereignis, das Zugriff auf ein TIdContext-Objekt bereitstellt, wird im Kontext eines Worker-Threads ausgelöst, der dieses Objekt ausführt. Der Zugriff auf UI-Komponenten muss stattdessen im Kontext des Hauptthreads erfolgen. Wenn Sie dieser Regel nicht folgen, können alle möglichen unerwarteten schlechten Dinge passieren. Sie müssen sich mit dem Haupt-Thread synchronisieren, zB:

uses 
    ..., IdSync; 

procedure TForm2.EServerConnect(AContext: TIdContext); 
begin 
    TIdNotify.NotifyMethod(ClientConnected); 
end; 

procedure TForm2.ClientConnected; 
begin 
    SrvMsg.Lines.Add('ECHO Client connected !'); 
end; 

procedure TForm2.EServerDisconnect(AContext: TIdContext); 
begin 
    TIdNotify.NotifyMethod(ClientDisconnected); 
end; 

procedure TForm2.ClientDisconnected; 
begin 
    SrvMsg.Lines.Add('ECHO Client disconnected !'); 
end; 
+0

Danke! Ich werde es versuchen! – EmirZ