AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler

For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler

Ein Thema von davtix · begonnen am 21. Jun 2021 · letzter Beitrag vom 23. Jun 2021
Antwort Antwort
Seite 2 von 2     12
davtix

Registriert seit: 29. Mai 2003
Ort: Berlin
87 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler

  Alt 22. Jun 2021, 08:30
Hi und guten Morgen.
Alles gut ^^ . Ist mir auch schon aufgefallen und habe das geändert,
Das baue ich mit Absicht so hin und kann dann schneller separieren. Wenn alles klappt dann sieht der Code auch so aus wie Du ihn dort geschrieben hast.

- zu box.Cells[2,indI] := konvertBytes( GetFileSize( tempS ) );
leider kommt dann manchmal chinesisch raus, meine Variante beschriftet wirklich jede

- weiter habe ich noch ein problem mit
-- GetCreationTimeOfFile
-- GetFileLastAccessTime
-- GetFileDate
Bei manchen Dateien werden die Daten nicht ausgelesen und der jeweilige Task bleibt dann hängen.

hab gerade mal mit sleep dazwischen probiert , aber nu wird der indI 11 wieder zu 12
Task 8 ist bei dem dateinamen konten.txt hängen geblieben -> hinweis könnten Adminrechte sein ... mal schauen
Delphi-Quellcode:
                  if ( FileExists( tempS ) ) then
                    begin
                      byte := GetFileSize( tempS );
                      tempS1 := inttostr( byte ); // konvertBytes( byte ); wird in seperater schleife abgefertigt

                      //delay(100);

                      tempS2 :='';
                      tempS2 := DateTimeToStr( GetCreationTimeOfFile( tempS )); //erstellt
                      sleep(100);

                      tempS3 :='';
                      tempS3 := DateTimeToStr( GetFileLastAccessTime( tempS )); //letzter zugriff
                      sleep(100);

                      tempS4 :='';
                      tempS4 := DateTimeToStr( GetFileDate( tempS )); //geändert

                      sleep(100);
                    end else
                    begin
                      tempS1 := 'n/a';
                      tempS2 := 'n/a';
                      tempS3 := 'n/a';
                      tempS4 := 'n/a';
                    end;




Delphi-Quellcode:
byte := GetFileSize( tempS );
tempS1 := inttostr( byte ); // konvertBytes( byte ); wird in seperater schleife abgefertigt


Hallo,

ich kritisiere eigentlich ungern an anderer Leute Code rum, da meiner oft auch nicht besser aussieht, aber hier ist der Code wirklich ineffizient/unübersichtlich und dazu leider auch noch falsch: du versuchst ein Änderungsdatum etc. zu ermitteln, auch wenn die Datei nicht existiert(bei der Größe prüfst du vorher...)

Mein Vorschlag würde wiefolgt aussehen:

Delphi-Quellcode:
for indI := 0 to box.RowCount - 1 do
begin
  if ( true = IsStringAInteger( box.Cells[ 9, indI] )) then
  begin
    if (strtoint(box.Cells[ 9, indI]) = tempTHI ) then
    begin
      tempS := box.Cells[ 7, indI];
      if ( FileExists( tempS ) ) then
      begin
        box.Cells[2,indI] := konvertBytes( GetFileSize( tempS ) );
        delay(100);
        box.Cells[3,indI] := DateTimeToStr( GetCreationTimeOfFile( tempS )); //erstellt
        box.Cells[4,indI] := DateTimeToStr( GetFileLastAccessTime( tempS )); //letzter zugriff
        box.Cells[5,indI] := DateTimeToStr( GetFileDate( tempS )); //geändert
      end;
    end;
  end;
end;
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
217 Beiträge
 
Delphi XE5 Professional
 
#12

AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler

  Alt 22. Jun 2021, 08:43
Uups, Cardinalsfehler: Ich nehme mal an, dass box ein VCL Element ist?
Wenn ja muss natürlich der Zugriff auf das box Element im Synchronize stattfinden:
Delphi-Quellcode:
TThread.Synchronize(nil,procedure ()
                    begin
                      box.Cells[2,indI] := tempS1; //dateigrösse
                      box.Cells[3,indI] := tempS2; //erstellt
                      box.Cells[4,indI] := tempS3; //letzter zugriff
                      box.Cells[5,indI] := tempS4; //geändert
                    end);
aber mal eine ganz andere Frage: du willst von 12(!) Dateien die Größe, und die anderen Metadaten ermitteln. Brauchst du dafür wirklich 12 Threads? Kannst du das nicht entweder im Hauptthread oder zumindest in einem einzelnen Thread abfackel? Für mich klingt das ein wenig nach "mit Kanonen auf Spatzen schießen"
Dirk
  Mit Zitat antworten Zitat
davtix

Registriert seit: 29. Mai 2003
Ort: Berlin
87 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler

  Alt 22. Jun 2021, 15:32
Cardinalsfehler ???? erzähle mir mehr darüber...

-> mit einem ADD button wird ein Tab,2 Buttons und nen StringGrid erstellt.
Dieses StringGrid = box.
Delphi-Quellcode:
      //wenn array nur 1 Row dann bestehende SG nutzen ->
      //ansonsten -> neues StringGrid erstellen
      if ( length(Sar) = 1 ) then
        begin
          n_SG := Form2.JvStringGrid1;
        end;
      if ( length(Sar) > 1 ) then
        begin
          n_SG := TJvStringGrid.Create( form2 );
          n_SG.Parent := TTabSheet( Tab );
          n_SG.Name := sg_navn;
          copy_option_JvStringGrid( form2.JvStringGrid1 , n_SG );
        end;

      //OnDrawCell auf neue SG setzen
      n_SG.OnDrawCell := Form2.JvStringGrid1DrawCell;
function read_ALL_data( path :string; box:TJvStringGrid ):string; wird später wieder zur Procedure gemacht.



aber mal eine ganz andere Frage: du willst von 12(!) Dateien die Größe,....

nee, es sollen alle Dateien mit Unterordner eingelesen werden.
Also ist die Idee, die erste Struktur in eine Stringlist zu packen, dann aufzuteilen (hier / 12 oder wenn X < 12 dann = X).
Sind es 24 ordner dann bekommt jeder Thread 2 Ordner die er mit Unterordner auslesen soll.
Jeder Thread hat eine eigene ErgebnisStringList die nach Ablauf aller Threats zusammengeführt, sortiert und in das Stringgrid gepackt wird.


Das Auslesen der Dateinamen geht wirklich deutlich schneller, jedoch mit zusätzlichen Daten (und dort bin ich gerade)ist gerade dieses futsch...

Cardinalsfehler :
Nu komm ich als erstes aud die IDEE die ErgebnisListe weiter zu nehmen, in nen Array zu packen, dort zu befüllen und anschliessend in die box zu übertragen?



---- So hab n Array gebastelt ----
grösse wie das StringGrid, inhalt ( kompletter dateipfad und name, indexnummer, threadaufteilung [0..11] )
also ProbeArray[ indI3, 2 ] := tempS1; //dateigrösse

--> erster Versuch , tempTHI ist wieder von 10 auf 12 gesprungen.
bei der Loganzeige stand (THI = 12 / tempTHI = 1) ( THI = 12 / tempTHI = 2) ( THI = 12 / tempTHI = 3 ) ... usw.

hab danach das delay zwischen den tasks.start auf 600ms gesetzt.
ergebnis -> jeder Thread inklusive 11 startet mit dem richtigen Integer. Ein Problem gelöst

--> neues Problem Thread hängt sich bei Dateinamen wie (Image1 - Kopie.jpg) auf






Uups, Cardinalsfehler: Ich nehme mal an, dass box ein VCL Element ist?
Wenn ja muss natürlich der Zugriff auf das box Element im Synchronize stattfinden:
Delphi-Quellcode:
TThread.Synchronize(nil,procedure ()
                    begin
                      box.Cells[2,indI] := tempS1; //dateigrösse
                      box.Cells[3,indI] := tempS2; //erstellt
                      box.Cells[4,indI] := tempS3; //letzter zugriff
                      box.Cells[5,indI] := tempS4; //geändert
                    end);
aber mal eine ganz andere Frage: du willst von 12(!) Dateien die Größe, und die anderen Metadaten ermitteln. Brauchst du dafür wirklich 12 Threads? Kannst du das nicht entweder im Hauptthread oder zumindest in einem einzelnen Thread abfackel? Für mich klingt das ein wenig nach "mit Kanonen auf Spatzen schießen"
Miniaturansicht angehängter Grafiken
unbenannt3.jpg  

Geändert von davtix (22. Jun 2021 um 17:02 Uhr)
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
186 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler

  Alt 23. Jun 2021, 07:54
Zitat:
Also ist die Idee, die erste Struktur in eine Stringlist zu packen, dann aufzuteilen (hier / 12 oder wenn X < 12 dann = X).Sind es 24 ordner dann bekommt jeder Thread 2 Ordner die er mit Unterordner auslesen soll.
Jeder Thread hat eine eigene ErgebnisStringList die nach Ablauf aller Threats zusammengeführt, sortiert und in das Stringgrid gepackt wird.
Das macht Dir eine TParallel.For schleife automatisch. Mein Vorschlag: lies erst Dein Hauptverzeichnis in eine Liste und arbeite diese Liste mit For() ab.

http://docwiki.embarcadero.com/Libra....TParallel.For

In TParallel.For sollten keine Synchronize Aufrufe stattfinden. Diese sind eigentlich meistens eine schlechte Idee, da sie den Thread dazu bringen zu warten. Besser ist es, das Ergebnis in eine geschützte Variable zu packen und der Oberfläche des Programmes mitzuteilen, dass sie die geschützte Variable auslesen darf um die Ergebnisanzeige zu aktualisieren.

Da TParallel.For den aktuellen Prozess blockiert, muss in diesem Fall der Aufruf in einem TTask.Run() erfolgen.
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf