Delphi-Quellcode:
procedure geetest.Execute;
begin
NameThreadForDebugging('threadgee');
{ Place thread code here }
form1.idftp1.get(filelistFINAL[i4],gethomepath+'/Temp/'+filelistFINAL[i4], true);
end;
Du darfst
Form1.IdFtp1.Get()
NICHT in deinem Thread aufrufen, weil du sonst die Funktion im
Hauptthread der Anwendung aufrufst (
TForm1
) und diese
dort auch ausgeführt wird. Das heisst dass dein Thread in dem Moment garkeinen Sinn mehr hat.
Was du in etwa machen musst:
Delphi-Quellcode:
unit threadtest;
interface
uses
System.Classes, System.SysUtils,
// Indy Units
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdExplicitTLSClientServerBase, IdFTP;
type
TThreadTest =
class(TThread)
constructor Create(AFileListFinal: TStringList);
destructor Destroy;
override;
protected
FIdFtp: TIdFTP;
FConnected: Boolean;
FDownloading: Boolean;
FFileList: TStringList;
procedure Execute;
override;
procedure AfterGet(Sender: TObject; Stream: TStream);
procedure Connected(Sender: TObject);
public
end;
implementation
function GetHomePath:
String;
begin
// Die Funktion darf ebenso KEINEN Zugriff auf Komponenten von Form1 oder sowas nehmen.
Result := '
/var/www/...';
end;
procedure TThreadTest.Execute;
var
i4: Integer;
begin
NameThreadForDebugging('
threadgee');
FConnected := FALSE;
FDownloading := FALSE;
i4 := 4;
FIdFtp.Connect;
while not Terminated
do
begin
Sleep(1);
if not FConnected
then
Continue;
if not FDownloading
then
begin
FDownloading := TRUE;
Sleep(500);
FIdFtp.Get(FFileList[i4], GetHomePath + '
/Temp/' + FFileList[i4], TRUE);
end;
end;
end;
constructor TThreadTest.Create(AFileListFinal: TStringList);
begin
FFileList := AFileListFinal;
FIdFtp := TIdFTP.Create(
nil);
with FIdFtp
do
begin
Host := '
...';
Username := '
lieschen';
Password := '
purzel123';
OnConnected := Connected;
OnAfterGet := AfterGet;
end;
inherited Create(FALSE);
FreeOnTerminate := TRUE;
end;
destructor TThreadTest.Destroy;
begin
FIdFtp.Free;
end;
procedure TThreadTest.Connected(Sender: TObject);
begin
FConnected := TRUE;
end;
procedure TThreadTest.AfterGet(Sender: TObject; Stream: TStream);
begin
Sleep(500);
FIdFtp.Disconnect;
FConnected := FALSE;
Terminate;
end;
end.
Aufruf in deiner
Form1
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
TTestThread.Create(filelistFINAL);
end;
Ungetestet und ausm Kopf. Also kopier das jetzt nicht einfach 1:1 und sag dann "Es geht nicht!!!111". Da krieg ich schlechte Laune.
Es soll nur das Prinzip verdeutlichen. Das ist ungefähr das, was Sir Rufo mit "autark" meint. Dein Thread darf sich nicht (ohne weiteres) von Inhalten aus Form1 bedienen oder Funktionen darauf aufrufen.