Einzelnen Beitrag anzeigen

nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

AW: Form reagiert nicht während idftp1.get trotz application.processmessages

  Alt 13. Jul 2014, 14:27
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.

Geändert von nuclearping (13. Jul 2014 um 15:31 Uhr)
  Mit Zitat antworten Zitat