Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Form reagiert nicht während idftp1.get trotz application.processmessages (https://www.delphipraxis.net/181068-form-reagiert-nicht-waehrend-idftp1-get-trotz-application-processmessages.html)

gee21 12. Jul 2014 17:42

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

Meine Android App lädt Daten von einem FTP Server herunter.


Delphi-Quellcode:
for i4 := 0 to filelistFINAL.Count-1 do begin

  if stop=false then begin

      progressbar1.value:=i4+1;

      try
      form2.idftp1.Get(filelistFINAL[i4], gethomepath+'/Temp/'+filelistFINAL[i4],true);
      except
      end;

  end;
end;

Auf FORM1 möchte ich nun dem Nutzer mit einem Button die Möglichkeit geben diese Download's abzubrechen.

Leider ist aber Form1 während des Downloads komplett eingefroren, so das mein "Abbruch Code" gar nicht ausgeführt werden kann.

Deshalb habe ich gedacht ich könnte zB in idftp on work
Delphi-Quellcode:
application.processmessages
einfügen um die form1 ansprechbar zu halten. Leider bringt es kein Effekt / Form1 reagiert einfach nicht.

Habe dann zum testen diverse stellen mit
Delphi-Quellcode:
application.processmessages
versucht aber egal wo ich es hinn pflanze, form1 reagiert einafch nicht. (Versucht habe ich es zB in einem Timer, idftp OnWork, on Workbegin/end, in der Schlaufe des idftp.get Downloads)

Weiss jemand wie ich form1 ansprechbar lassen kann?

nuclearping 12. Jul 2014 19:26

AW: Form reagiert nicht während idftp1.get trotz application.processmessages
 
Zieh dir mal eine Bei Google suchenTIdAntiFreeze-Komponente auf die Form.

gee21 12. Jul 2014 20:00

AW: Form reagiert nicht während idftp1.get trotz application.processmessages
 
diese komponente gibt's eben für Android Anwendungen leider nicht.

nuclearping 12. Jul 2014 20:17

AW: Form reagiert nicht während idftp1.get trotz application.processmessages
 
Schau mal hier: http://www.delphipraxis.net/1253064-post7.html

gee21 12. Jul 2014 20:55

AW: Form reagiert nicht während idftp1.get trotz application.processmessages
 
Hmmm. Also ich weiss nicht. Vermutlich mache ich es falsch :(

Habe mir das Beispiel einmal heruntergeladen und versucht es zu übernehmen. (Alles was ich nicht verstanden habe, habe ich einfach weggelassen :oops::oops: ) http://www.delphipraxis.net/1253064-post7.html

Aber ich glaube das so wie ich das gemacht habe, läuft alles genau "gleich ab". Nur das der Code oben in einer Procedure steht.


Delphi-Quellcode:
procedure geeTest(Source: string; dest: string);

begin
  try
    form2.idftp1.get(source, dest, true);
    sleep(400);
    application.ProcessMessages;
  except

  end;

end;

Delphi-Quellcode:
for i4 := 0 to filelistFINAL.Count-1 do begin

  if stop=false then begin

  progressbar1.value:=i4+1;
  try
  geetest(filelistFINAL[i4],gethomepath+'/Temp/'+filelistFINAL[i4]);
  except
  end;

end;
end;

RWarnecke 12. Jul 2014 23:56

AW: Form reagiert nicht während idftp1.get trotz application.processmessages
 
Ich habe in einer meiner Apps den Aufruf von TIdHTTP in einen Thread ausgelagert. Damit funktioniert die Anzeige mit dem TAniIndicator hervorragend.

gee21 13. Jul 2014 11:43

AW: Form reagiert nicht während idftp1.get trotz application.processmessages
 
Danke für eure Antworten.

Könnt ihr mir evt etwas helfen mit diesem Thread. Habe das bis jetzt noch nie gemacht.
Also mit Google und DocWiki http://docwiki.embarcadero.com/RADSt...ngen_erstellen

Habe ich in Delphi unter: Datei->NEU->Andere->Thread Object ein neues "Thread Formular erstellt"

das heisst nun threadtest.pas

Das Programm startet nun und ich versuche auf Form1 diesen "Thread Code" so aufzurufen:
Delphi-Quellcode:
 geetest.Create(False);
Dann gibt es aber eine Exception Meldung (Access Violation at Adress 61B3D93C, accessing adress 00000000)




In diesem "Thread Formular" habe ich nun folgendes drinn: (Vermutlich ziemlich alles falsch :oops:)

Delphi-Quellcode:
unit threadtest;

interface

uses
    System.Classes, f1diashow, System.SysUtils;

type
  geetest = class(TThread)
  protected
    procedure Execute; override;
  end;


implementation


procedure geetest.Execute;
begin
  NameThreadForDebugging('threadgee');
  { Place thread code here }

  form1.idftp1.get(filelistFINAL[i4],gethomepath+'/Temp/'+filelistFINAL[i4], true);
end;

end.

Mavarik 13. Jul 2014 12:06

AW: Form reagiert nicht während idftp1.get trotz application.processmessages
 
[OT]Autsch[/OT]

Ich nehme zwar kein FTP, sondern http... Aber die Funktionalität ist ja fast die selbe...


Delphi-Quellcode:
Procedure Foo;
var
  URL, Dateiname : String;
begin
  URL := 'Http://www.meinserver.de/Datei.png';
  Dateiname := 'C:\Hierhin\Datei.png';

  lThread := TAnonymousThread<boolean>.Create(
    function: boolean
    var
      idhttp : TidHttp;
      FS    : TFileStream;
      DN    : String;
    begin
      DN := Dateiname;
      result := true;
      if not(fileExists(DN)) then
      begin
        FS := TFileStream.Create(DN,fmCreate);
        try
          idhttp := Tidhttp.Create;
          try
            idhttp.Get(URL,FS);
          finally
            idhttp.Free;
          end;
        finally
          FS.Free;
        end;
      end;
    end,
    procedure(AResult: Boolean)
    begin
    end,
    procedure(AException: Exception)
    begin
      //Runs in main thread
      //ShowMessage(AException.Message);
    end);
end;
Mavarik

gee21 13. Jul 2014 12:22

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

Zitat von Mavarik (Beitrag 1265362)
[OT]Autsch[/OT]

Ich nehme zwar kein FTP, sondern http... Aber die Funktionalität ist ja fast die selbe...


Delphi-Quellcode:
Procedure Foo;
var
  URL, Dateiname : String;
begin
  URL := 'Http://www.meinserver.de/Datei.png';
  Dateiname := 'C:\Hierhin\Datei.png';

  lThread := TAnonymousThread<boolean>.Create(
    function: boolean
    var
      idhttp : TidHttp;
      FS    : TFileStream;
      DN    : String;
    begin
      DN := Dateiname;
      result := true;
      if not(fileExists(DN)) then
      begin
        FS := TFileStream.Create(DN,fmCreate);
        try
          idhttp := Tidhttp.Create;
          try
            idhttp.Get(URL,FS);
          finally
            idhttp.Free;
          end;
        finally
          FS.Free;
        end;
      end;
    end,
    procedure(AResult: Boolean)
    begin
    end,
    procedure(AException: Exception)
    begin
      //Runs in main thread
      //ShowMessage(AException.Message);
    end);
end;
Mavarik


Also will mich jetzt wirklich nicht quer stellen. Aber wo hast du nun diesen Code drinn? In dem neuen Thread? oder auf der zB Form1?

Luckie 13. Jul 2014 12:36

AW: Form reagiert nicht während idftp1.get trotz application.processmessages
 
Nur kurz zur Erklärung, damit beim nächsten mal nicht wieder gefragt wird. Die Methode Get kehrt erst zurück, wenn sie fertig ist. Da kannst da du vor und danach so oft die Messageque abarbeiten wie du willst, die Methode wird dir trotzdem dein Programm blockieren. Wenn dann müsste das Apploication.ProcessMessages in die Get Methode rein. Da du aber da keinen Einfluss drauf hast, hilft es nur die Methode in einen separaten Thread auszulagern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz