Hallo,
leider ist mir für mein Problem nicht so recht eine treffende Bezeichnung eingefallen. Also erklär ich mal mein Problem.
Ich habe in meiner Klasse folgende Functions:
Delphi-Quellcode:
function TLivetrack.refresh(const RealName : String; const ATC_Position : String; const Tool : String) : boolean;
function datainlist(const TList : TStringlist) : integer;
var i : Integer;
begin
result := -1;
if TList.Count = 0 then
exit;
for i := 0 to TList.Count - 1 do
if self.FVID = copy(TList.Strings[i],1,pos(':',TList.strings[i]) - 1) then
begin
result := i;
break;
end;
end;
var TList : Tstringlist;
Index : integer;
FileName : string;
TimeStamp : string;
begin
result := false;
TList := TStringlist.Create;
FileName := self.FCacheDirectory + '\' + self.FFileName;
try
if Fileexists(FileName) then
Tlist.LoadFromFile(FileName);
Index := datainList(TList);
TimeStamp := createTimeStamp;
if Index = -1 then
TList.add(self.FVID + ':' + TimeStamp + ':' + RealName + ':' + ATC_Position + ':' + Tool)
else
TList.strings[Index] := self.FVID + ':' + TimeStamp + ':' + RealName + ':' + ATC_Position + ':' + Tool;
finally
result := true;
end;
TList.SaveToFile(FileName);
TList.Free;
end;
function TLivetrack.upload(TimeOut : Integer) : boolean;
begin
result := false;
self.FFTP.Port := 21;
self.FFTP.Connect(true,TimeOut);
if self.FFTPDirectory <> '' then
self.FFTP.ChangeDir(self.FFTPDirectory);
try
self.FFTP.Put(self.FCacheDirectory + '\' + self.FFileName , self.FFileName , false);
finally
result := true;
end;
self.FFTP.Disconnect;
end;
function TLivetrack.download(TimeOut : Integer) : boolean;
var FileStream : TFileStream;
begin
result := false;
FileStream := TFileStream.create(self.FCacheDirectory + '\' + self.FFileName,fmcreate);
self.FHTTP.Connect(TimeOut);
try
self.FHTTP.Get(self.FHTTPUrl + '/' + self.FFileName , FileStream);
finally
result := true;
end;
FileStream.free;
self.FHTTP.Disconnect;
end;
Diese Functions rufe ich wie folgt auf:
Delphi-Quellcode:
form1.Livetrack.download(10000);
form1.Livetrack.refresh(getRealname,GetATCPosition,'EC3');
form1.Livetrack.upload(10000);
Nun tritt folgendes auf: (allerdings nicht bei meinem Rechner, so dass das ganze nur von Berichten her erklärt werden kann)
Erstmals ein Socketfehler 10061, der aber denke ich nichts mit meiner HTTP und
FTP Komponente zu tun hat.
Es kommt die Fehlermeldung "...data.csv konnte nicht zugegriffen werden, sie wird von einem anderen Prozess verwendet" oder so.
Die data.csv wird über die Function downlaod geldaden und in eine Datei gespeichert. Diese wird dann in der Function refresh in eine Liste geladen und verarbeitet un erneut gespeichert. Danach wird sie über uplaod wieder auf den Server geladen.
Nun tritt das Problem erst seit kurzem auf , vorwiegend auf Vista.
Meine Vermutung wäre, laut Fehlermeldung, dass die Datei nicht so schnell gespeichert werden kann, bevor die nächste Function aufgerufen wird. Könnte das der Fall sein, oder geht das Programm nicht weiter im Quellcode, wenn die Datei nicht richtig gespeichert wurde?
Ich finde dies nur merkwürdig, da es auf meinen Rechnern tadellos funktioniert.
Wer hat eine Lösung?
Desweiteren wäre die Frage, wie man villeicht das "zwischenspeichern" in einer Datei vermeiden könnte, ist ja doch sehr unvorteilhaft. Wenn ich die Datei lade, habe ich sie als Stream da, könnte man diesen so umwandeln un den Inhalt in eine Liste oder ein Array Laden, dann bearbeiten, wieder in eine Liste oder so packen, und dann als diese wieder uploaden oder geht das nicht so einfach!?
Vielen Dank für eure Hilfe!