![]() |
TidTCPServer/TidTCPClient und Delphi 7: freezing...
hi,
ich habe vorhin mal das ![]() dort hat jemand schon angesprochen, dass es zu einem problem kommt, wenn das projekt mit delphi 7 compiliert wird: der server friert nach dem erhalten des ersten pakets (20kb) ein - trotz TidAntiFreeze. ich habe das problem auch. ich benutze die indy's 9.0.14 und delphi 7 enterprise. kann mir jemand sagen, wie ich dieses problem lösen kann? danke, Aenogym |
Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...
Er friert nach Empfang des Paketes ein? Poste mal 'n bisschen Code
|
Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...
ja, er empfängt die ersten 20KB (die datei wird immer in 20KB-stückchen nacheinander gesendet).
der code ist ziemlich lang.... der client sendet per:
Delphi-Quellcode:
und der server empfängt im onExecute so:
TcpClient.OpenWriteBuffer;
TcpClient.WriteStream(TempMemoryStream,true,true); TcpClient.CloseWriteBuffer;
Delphi-Quellcode:
in beiden fällen bezeichnet TempMemoryStream einen memorystream (wer hätte es gedacht...).
AThread.Connection.ReadStream(TempMemoryStream);
edit: am code ist nichts falsch. compiler kompiliert ohne murren und unter delphi 5 funktioniert es nach datacools aussage perfekt... Aenogym |
Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...
Hallo ich das gleiche Problem wie Aenogym.
Wenn ich das Projekt runterlade und ausführe dann funktioniert alles bestens, wenn ich aber die Projektdateien öffne und neu Compiliere (Delphi 7 Pro) so funktioniert das ganze nicht mehr. Ich habe herausgefnunden an was es liegt, konnte aber das Problem nicht lösen. Das Problem liegt in folgender Funktion:
Delphi-Quellcode:
Genauer gesagt liegt es an dieser Zeile:
function TFileReceiver.Start : Boolean;
Var bError : Boolean; bReady : Boolean; fs : TFileStream; begin result := true; if iFileSize > 0 then begin // Alle Startwerte setzen bError := false; bReady := false; iReceivedBytes := 0; // erstmal versuchen die Datei zu erstellen // das Zielverzeichnis wo die Daten gespeichert werden sollen könnt Ihr nachher selber bestimmen sFileName := 'C:\'+sFileName; try fs := TFileStream.Create(sFileName,fmCreate or fmShareExclusive); except // Fehler beim Erstellen der Datei aufgetreten result := false; exit; end; try // Solange keine Abbruch Bediengung erreicht ist Stream-Pakete lesen While (not AThread.Terminated) and (AThread.Connection.Connected) and (not bError) and (not bReady) do begin // Buffer(Speicher-Stream) leeren tmpMS.clear; try // versuchen Stream zu Lesen AThread.Connection.ReadStream(tmpMS); // Steht jetzt auch wirklich was im Stream drin if tmpMS.Size > 0 then begin // die gelesenen Bytes jetzt direkt in den FileStream schreiben fs.copyFrom(tmpMS,0); // Anzahl der gelesenen Bytes erhöhen iReceivedBytes := iReceivedBytes + tmpMS.Size; // jetzt durch den Thread die Methode UpdateProgress ausführen // dieses muss mit Syncronize gemacht werden, mehr dazu in Delphi Hilfe AThread.Synchronize(UpdateProgress); end; bReady := (fs.Size = iFileSize); except // Fehler beim Lesen des Stream aufgetreten, Speicher leeren tmpMS.Clear; // Vorgang abbrechen bError := true; end; end; finally fs.free; if bError then DeleteFile(sFileName); end; result := FileExists(sFileName); end; end;
Delphi-Quellcode:
Wenn ich also "AThread.Synchronize(UpdateProgress);" aus der Funktion herausnehme funktioniert das Programm wieder. Leider ist dann die ProgressBar nicht mehr verfügbar.
// jetzt durch den Thread die Methode UpdateProgress ausführen
// dieses muss mit Syncronize gemacht werden, mehr dazu in Delphi Hilfe AThread.Synchronize(UpdateProgress); Wenn ich also während des Empfangen, irgendetwas versuche anzuzeigen bleibt das Programm hängen. Und Wenn es nur ein "Refresh" ist. Kann mir jemand sagen warum das bei Delphi 7 so ist? DataCool hat es mit Delphi 5 programmiert und es hat funktioniert. Hat jemand eine Lösung für das Problem? |
Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...
Hi,
also unter Delphi 6 läuft es auch ;-) Delphi 7 hab ich leider vom Chef noch nicht freigegeben bekommen. Wenn dann will ich auch gleich das 2005 haben :mrgreen: Tja, wenn es wirklich an dem Syncronize aufruf liegt, dann hat D7 ein Problem. Ich verwende ja das syncronize um die Progressbar Thread sicher zu betreiben. Was passiert denn wenn Du einfach nur das syncronize weg lässt und nur UpdateProgress aufrufst ? Gruß Data |
Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...
danke,
das klappt! aber hat die lösung jetzt einen nachteil, da sie nicht mehr thread-sicher ist? Aneogym |
Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...
Hi,
es ist einfach nicht sauber, jede Interaktion mit dem VCL User-Interface sollte syncronisiert werden. Vielleicht hat sich ja in D7 was dran geändert *g Meiner Meinung nach ist es dann nicht mehr Thread-Safe, aber andererseits wird die Progressbar ja nur exklusiv vom Thread benutzt, also sollte es auch ohne syncronize gehen. Try and Error würde ich mal sagen ;-) Aber Feedback hier posten, damit wird alle schlauer sind ;-) cya Data |
Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...
Zitat:
dankeschön aber bis hierhin, Aenogym |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 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