Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

Sir Rufo 13. Jul 2014 18:25

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

Zitat von gee21 (Beitrag 1265396)
Zitat:

Zitat von Sir Rufo (Beitrag 1265394)
Nun dann solltest du beten, dass du die Form niemals umbenennst und den Thread nur einmal erzeugst ...

Ok, vielleicht ändere ich es dann doch noch lieber. Danke :thumb:

Aber ich habe jetzt den Thread 3-4 mal im selben Programmstart aufgerufen und es klappt tiptop. :?:

Dann erzeuge doch mal direkt 2 Instanzen von dem Thread und schau dir an, was dabei rauskommt.

Bzw. zeig doch mal den Code, wie du den Thread "aufrufst" ...

Mavarik 13. Jul 2014 18:47

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

Zitat von gee21 (Beitrag 1265365)
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?

Häää?

Das ist der "Thread"...
Auf der Form? Das ist nix zum draufklicken... Nur aufrufen...


Mavarik

Mavarik 13. Jul 2014 18:55

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

Zitat von nuclearping (Beitrag 1265380)
Du darfst
Delphi-Quellcode:
Form1.IdFtp1.Get()
NICHT in deinem Thread aufrufen, weil du sonst die Funktion im Hauptthread der Anwendung aufrufst (
Delphi-Quellcode:
TForm1
) und diese dort auch ausgeführt wird. Das heisst dass dein Thread in dem Moment garkeinen Sinn mehr hat.

Wie kommst Du den darauf?

gee21 13. Jul 2014 19:01

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

So ruf ich ihn auf (in einem Button)
Delphi-Quellcode:
geetest.Create(False);
Und das ist der komplette Thread :oops:

Delphi-Quellcode:
unit threadtest;

interface

uses
  System.Classes, f1diashow,f4einstellungendiashow, System.SysUtils;

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


implementation


procedure vclsettings;
begin
                  form1.Image1.Visible:=true;
                  form1.Image1.Bitmap.LoadFromFile(playlist[0]);
                  form1.image1.Height:=form1.Height;
                  form1.image1.Width:=form1.Width;
                  form1.image1.Position.X:=0;
                  form1.image1.Position.Y:=0;
                  count:=0;
                  form1.speedbutton1.Visible:=false;
                  form1.speedbutton3.Visible:=false;
                  form1.listbox1.Visible:=false;
                  form1.Panel2.Visible:=false;
                  form1.Timer1.Enabled:=true;
                  form1.speedbutton2.Visible:=true;
                  form1.label3.Visible:=false;
                  form1.progressbar1.Value:=0;
end;



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


  if filelistFINAL.Count>form4.SpinBox2.Value-1 then  form1.progressbar1.Max:=form4.SpinBox2.Value else  form1.progressbar1.Max:= filelistFINAL.Count;

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

          if stop=false then begin
          form1.progressbar1.value:=i4+1;

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

          PlayList.add(gethomepath+'/Temp/'+filelistFINAL[i4]);

          //Während des Downloads wird die DIASHOW gestartet (ja nach Puffer Grösse)
  if form1.Timer1.Enabled=false then begin

           if filelistfinal.Count>form4.SpinBox2.Value-1 then begin
                  //SOFERN playlist grösser ist als der Puffer
                  if PlayList.Count>form4.spinbox2.value-1 then begin
                  form1.progressbar1.value:=i4+1;
                  form1.timer1.interval:=strtoint(form4.SpinBox1.text)*1000;
                   Synchronize(vclsettings);
                  end;

               // ist die FileListFINAL kleiner als der Puffer und aber mindestens 1 Bild geladen
         end else if playlist.count>-1 then begin
                  form1.progressbar1.value:=i4+1;
                  form1.timer1.interval:=strtoint(form4.SpinBox1.text)*1000;
                  Synchronize(vclsettings);
                  end;


          end;
      end else begin
       //Schlaufe wir abgebrochen da Boolean STOP=TRUE ist
      form1.timer1.Enabled:=false;
      form1.image1.Bitmap:=nil;
      form1.speedbutton1.Visible:=true;
      form1.speedbutton3.Visible:=true;
      form1.listbox1.Visible:=true;
      form1.image1.Visible:=false;
      form1.label3.Visible:=true;
      form1.speedbutton2.Visible:=false;
      form1.panel2.Visible:=false;

       break;

      end;

end;

end;
end.


:oops:




@ Mavarik:

Ja habe eben bis heute noch nie mit einem Thread gearbeitet. (Wie du wahrscheinlich sehr gut am meinem oben erkennen kannst). :oops::oops:



@nuclearping

Irgendeinen Unterschied macht es schon. den so friert die form1 nicht mehr ein.

Sir Rufo 13. Jul 2014 19:16

AW: Form reagiert nicht während idftp1.get trotz application.processmessages
 
Ich weiß nicht wo ich da anfangen soll ... ok, da ist irgendwie alles falsch, was man falsch machen kann.
  • Exception-Handling
  • Zugriff über
    Delphi-Quellcode:
    form1
  • Zugriff vom Thread-Kontext auf den MainThread-Kontext
  • Delphi-Quellcode:
    if stop = false
    ist noch der harmloseste, warum nicht
    Delphi-Quellcode:
    if not stop
    ?

Die Funktion kommt glücklicherweise zustande und unglücklicherweise tut da tatsächlich was, so dass du denkst, so kann man das ruhig machen.

Ein Tutorial zum Thema Threadding und Grundlagen zum Threadding allgemein wären dringend angebracht, wenn du ernsthaft mit Threads arbeiten möchtest. Das ist allerdings der Ritt auf Messers Schneide ohne Gurt.

gee21 13. Jul 2014 19:25

AW: Form reagiert nicht während idftp1.get trotz application.processmessages
 
ok. Muss mich da mal komplett informieren. Bis heute bin ich immer ohne Threads ausgekommen.

Danke

nuclearping 13. Jul 2014 19:56

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

Zitat von Mavarik (Beitrag 1265406)
Wie kommst Du den darauf?

Was?

Mavarik 14. Jul 2014 10:02

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

Zitat von nuclearping (Beitrag 1265415)
Zitat:

Zitat von Mavarik (Beitrag 1265406)
Wie kommst Du den darauf?

Was?

Zitat:

Zitat von nuclearping (Beitrag 1265380)
Du darfst
Delphi-Quellcode:
Form1.IdFtp1.Get()
NICHT in deinem Thread aufrufen, weil du sonst die Funktion im Hauptthread der Anwendung aufrufst

Der Zugriff auf eine Variable (hier Form1) regelt doch nicht in welchem Thread etwas ausgeführt wird...

Das ich die Erzeugung von IdFtp1 im Thread für besser halte, lassen wir mal außen vor...

Das es ggf. Probleme geben kann, falls Form1 schon weg ist auch...

Funktionieren würde es trotzdem!

Mavarik

hathor 14. Jul 2014 11:22

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

Zitat von Sir Rufo (Beitrag 1265374)
Ein Beispiel aus dem Leben:

Jedes Auto ist ein eigener Thread und jedes Auto kann völlig unabhängig voneinander fahren.

Schlechtes Beispiel...
Da stand einer noch nie im Stau!...:lol:

Sir Rufo 14. Jul 2014 13:40

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

Zitat von hathor (Beitrag 1265456)
Zitat:

Zitat von Sir Rufo (Beitrag 1265374)
Ein Beispiel aus dem Leben:

Jedes Auto ist ein eigener Thread und jedes Auto kann völlig unabhängig voneinander fahren.

Schlechtes Beispiel...
Da stand einer noch nie im Stau!...:lol:

Wieso kannst du im Stau nicht fahren? Hast du schon mal versucht im Stau einfach aufs Gas zu drücken? Das Auto bewegt sich, der Stau ist dem Auto erst mal völlig egal (oder woher kommen die ganzen Auffahrunfälle im Stau?)

Oder meinst du etwa nicht fahren dürfen bzw. nicht fahren sollen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.
Seite 3 von 4     123 4      

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