AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TidTCPServer/TidTCPClient und Delphi 7: freezing...
Thema durchsuchen
Ansicht
Themen-Optionen

TidTCPServer/TidTCPClient und Delphi 7: freezing...

Ein Thema von Aenogym · begonnen am 19. Sep 2004 · letzter Beitrag vom 20. Feb 2005
Antwort Antwort
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#1

TidTCPServer/TidTCPClient und Delphi 7: freezing...

  Alt 19. Sep 2004, 21:02
hi,

ich habe vorhin mal das filesend-beispiel von datacool ausprobiert.

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
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
moritz

Registriert seit: 18. Apr 2003
1.037 Beiträge
 
#2

Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...

  Alt 19. Sep 2004, 21:12
Er friert nach Empfang des Paketes ein? Poste mal 'n bisschen Code
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...

  Alt 19. Sep 2004, 21:48
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:
TcpClient.OpenWriteBuffer;
TcpClient.WriteStream(TempMemoryStream,true,true);
TcpClient.CloseWriteBuffer;
und der server empfängt im onExecute so:
AThread.Connection.ReadStream(TempMemoryStream); in beiden fällen bezeichnet TempMemoryStream einen memorystream (wer hätte es gedacht...).

edit: am code ist nichts falsch. compiler kompiliert ohne murren und unter delphi 5 funktioniert es nach datacools aussage perfekt...

Aenogym
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
cgimda

Registriert seit: 20. Jan 2005
5 Beiträge
 
#4

Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...

  Alt 26. Jan 2005, 14:28
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:
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;
Genauer gesagt liegt es an dieser Zeile:

Delphi-Quellcode:
// 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 "AThread.Synchronize(UpdateProgress);" aus der Funktion herausnehme funktioniert das Programm wieder. Leider ist dann die ProgressBar nicht mehr verfügbar.

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?
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...

  Alt 20. Feb 2005, 19:38
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

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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...

  Alt 20. Feb 2005, 19:59
danke,

das klappt! aber hat die lösung jetzt einen nachteil, da sie nicht mehr thread-sicher ist?

Aneogym
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...

  Alt 20. Feb 2005, 20:14
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: TidTCPServer/TidTCPClient und Delphi 7: freezing...

  Alt 20. Feb 2005, 20:25
Zitat von DataCool:
Try and Error würde ich mal sagen

Aber Feedback hier posten, damit wird alle schlauer sind
also bei mir läuft's. wenn es bei den testerns meines programms probleme gibt, werd ich mich sicher nochmal melden

dankeschön aber bis hierhin,
Aenogym
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 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