![]() |
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:
Server:
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;
Delphi-Quellcode:
Könnte mir vielleicht sagen wo das Problem liegt, denn eigentlich sollte das versenden von Dateien mit Indy 10 ja auch ohne splitten gehn??
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; Mfg |
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.
|
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???? |
Re: Problem bei versenden größerer Dateien mit Indy 10
Timer? Dann ist es klar...
Probier doch folgendes:
Delphi-Quellcode:
also im Timer so:
// Von DSDT.info
procedure Pause(MilliSek: LongWord); var Start : Cardinal; begin Start := GetTickCount; repeat Application.ProcessMessages until (GetTickCount - Start > MilliSek); end;
Delphi-Quellcode:
Das Timer-Interval kann dann z.B. 1 Sekunde sein, da (zumindest bei mir) durch die Pause das ganze Programm angehalten wird.
DateiSenden;
Pause(25000); // für 25 Sekunden |
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:
Ist zwar nicht die schönste Lösung aber sie funktioniert.
Timer1.enabled := False;
DateiSenden; Timer1.enabled := True; Mfg st0rm |
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