Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem bei versenden größerer Dateien mit Indy 10 (https://www.delphipraxis.net/52543-problem-bei-versenden-groesserer-dateien-mit-indy-10-a.html)

storm1988 30. Aug 2005 18:00


Problem bei versenden größerer Dateien mit Indy 10
 
Seas!

Ich hab mir folgenden Code zusammengebastelt um Datein vom Server an den Client zu senden, mithilfe der Indy 10 Komponente idtcp. Jedoch wenn ich Dateien über ca. 25 MB versende bekomme ich folgende Fehlermeldung: Der Prozess kann nicht auf die Datei zugreifen , da sie von einem anderen Prozess verwendet wird!!

Hier ist mal mein Code:

Client

Delphi-Quellcode:
procedure DateiSendeButtonClick;

var FStream : TFileStream;
    SizeOfIncomingStream : Integer;
    IDS : TidStreamVCL;

begin

  { Die Streams initialisieren - Beim IDS wird FStream gleich eingelesen }
  FStream := TFileStream.Create(Pfad, fmCreate);
  IDS := TidStreamVCL.Create(FStream);

  { Senden }
with frmServer.IdTCPClient1 do
  begin
      SizeOfIncomingStream := Socket.ReadInteger;;
      Socket.ReadStream(IDS, SizeOfIncomingStream);
  end;

  IDS.VCLStream.Position := 0;

  { Nicht vergessen ;-) }
  FStream.Free;
  IDS.Free;
end;
Server:

Delphi-Quellcode:
procedure KopierenToClient (AContext: TIdContext;Pfad : String);
var FSTream : TFileStream;
    SizeOfIncomingStream : Integer;
    IDS : TidStreamVCL;

begin

  FStream := TFileStream.Create(Pfad,fmOpenRead or fmShareDenyWrite)
  IDS := TidStreamVCL.Create(FStream);

  { Empfangen }
  with AContext.Connection do
  begin
      Socket.Write(IDS, 0, true);

  end;




  FStream.Free;
  IDS.Free;
end;
Könnte mir vielleicht sagen wo das Problem liegt, denn eigentlich sollte das versenden von Dateien mit Indy 10 ja auch ohne splitten gehn??

Mfg

ManuMF 30. Aug 2005 18:43

Re: Problem bei versenden größerer Dateien mit Indy 10
 
Ich hab schon ohne Probleme über 500 MB geschafft. Ich habe beim Öffnen fmShareDenyWrite nicht verwendet, glaube aber nicht, dass es daran liegt.

storm1988 30. Aug 2005 22:03

Re: Problem bei versenden größerer Dateien mit Indy 10
 
Ha habs selber raus gefunden. Es ist daran gelegen, dass die Prozedure "Socket.ReadStream(IDS, SizeOfIncomingStream)" in einem Thread behandelt wird (glaub ich zumindest, da der Timer bei meinem Client eine erneute verbindung zwischen der Datenübertragung aufgenommen hat).
Gibt es eine Mölichkeit, dass man das unterbindet also, dass das Programm erst die Übertragung abschließt????

ManuMF 31. Aug 2005 10:08

Re: Problem bei versenden größerer Dateien mit Indy 10
 
Timer? Dann ist es klar...

Probier doch folgendes:
Delphi-Quellcode:
// Von DSDT.info

procedure Pause(MilliSek: LongWord);
  var Start : Cardinal;
begin
  Start := GetTickCount;
  repeat
    Application.ProcessMessages
  until
    (GetTickCount - Start > MilliSek);
end;
also im Timer so:
Delphi-Quellcode:
DateiSenden;
Pause(25000); // für 25 Sekunden
Das Timer-Interval kann dann z.B. 1 Sekunde sein, da (zumindest bei mir) durch die Pause das ganze Programm angehalten wird.

storm1988 31. Aug 2005 10:13

Re: Problem bei versenden größerer Dateien mit Indy 10
 
Ja alles schön und gut aber wie soll ich wissen wie lang ich den Timer anhalten soll??? Des kommt ja sowohl auf die Übertragungsrate an als auch auf die Größe der Datei!!

Ich hab des ganze so realisiert dass ich am Anfang der Übertragung den Timer ausgeschaltet habe und bei der fertigen Übertragung hab ich ihn wieder eingeschalten!

Delphi-Quellcode:
Timer1.enabled := False;
DateiSenden;
Timer1.enabled := True;
Ist zwar nicht die schönste Lösung aber sie funktioniert.

Mfg st0rm

ManuMF 31. Aug 2005 10:27

Re: Problem bei versenden größerer Dateien mit Indy 10
 
Solange gesendet wird, läuft der Timer einfach nicht.
Also ich halte das für mit die beste Lösung!


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