Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler (https://www.delphipraxis.net/208175-schleife-zaehlt-mehr-als-vorhanden-itask-schleife-integer-fehler.html)

davtix 21. Jun 2021 16:57

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

im folgenden Bsp. zählt die (var THI :integer) mehr als angegeben und lässt eine Zählung aus.
Also THI = 0,1,2,3,4,5,6,7,8,9,10,12 <<
Ich dachte hier überschneidet sich irgendwas und wollte dies mit tempTHI := THI; //thi integer für task separieren. doch auch hier wird die 11 ausgelassen und mit 12 weitergemacht.

- Wieso zählt hier ein festes integer Array weiter als angegeben ?
- continue hab ich hier ausgesetzt , ohne erfolg



Delphi-Quellcode:

  TTasks = Array [0..11] of ITask;
  TTaskActiveArray   = Array [0..11] of integer;
var
  Tasks:TTasks;
  TaskActiveAr:TTaskActiveArray;


Delphi-Quellcode:
var THI:integer;


anyTaskIsRunning := 1;
for THI := 0 to 11  do
    begin
      log(1,'read_ALL_data->TaskActiveAr['+ inttostr(THI) +'] = ' + inttostr( TaskActiveAr[THI] ) + ' begin');

      //thread erstellen
      Tasks[THI] := TTask.Create( procedure () var indI, tempTHI, is_own_number, byte : integer; tempS, tempS1, tempS2, tempS3, tempS4:string;
        begin
          tempTHI := THI; //thi integer für task separieren
          //task I/O ob task running (0 fetrig, 1 running, 2 soll, 3 nicht gebraucht)
          TaskActiveAr[tempTHI] := 1;                                          log(7,'read_ALL_data->TASK TaskActiveAr['+ inttostr(tempTHI) +'] = ' + inttostr( TaskActiveAr[tempTHI] ) + ' begin');
          log(0,'tempTHI / THI = ' + inttostr( tempTHI ) + ' / ' + inttostr( THI ) );


          //thread geht komplette liste durch und bearbeitet nur seine threadnummer
          for indI := 0 to box.RowCount - 1 do
            begin
              tempI := -1; is_own_number := 0;
              //threadnummer auslesen und in integer wandeln wenn möglich
              if ( true = IsStringAInteger( box.Cells[ 9, indI] )) then
                begin
                  tempI := strtoint(box.Cells[ 9, indI]);     //log(0,'IsStringAInteger --> line('+ inttostr( indI ) +') = tempI : ' + inttostr( tempI ) );
                end else
                begin
                  //log(0,'line (' + inttostr( tempI ) + ') IsStringAInteger -> line('+ inttostr( indI ) +') = false --> continue ');
                  //wenn kein integer dann überspringe
                  //continue;
                end;

              //prüfen ob eigene threadnummer
              if ( tempI = tempTHI ) then
                begin
                  is_own_number := 1;         // log(0,'is_own_number --> line('+ inttostr( indI ) +') = tempI : ' + inttostr( tempI ) + ' == tempTHI: ' + inttostr( tempTHI ) );
                end else
                begin
                  //log(0,'is_own_number -->FALSE line('+ inttostr( indI ) +') = tempI : ' + inttostr( tempI ) + ' == tempTHI: ' + inttostr( tempTHI ) );
                  //wenn nicht dann überspringe
                  //continue;
                end;

              if (is_own_number = 1) then
                begin
                  tempS:= ''; tempS1 := ''; tempS2:= ''; tempS3:= ''; tempS4 := '';
                  //kompletten pfad einlesen
                  tempS := box.Cells[ 7, indI];

                  tempS1 :='';
                  if ( FileExists( tempS ) ) then
                    begin
                      byte := GetFileSize( tempS );
                      tempS1 := konvertBytes( byte );
                      delay(100);
                    end;

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

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

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

                end;


              if (is_own_number = 1) then
                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;

            end; //thread geht komplette liste durch und bearbeitet nur seine threadnummer --> end

              TThread.Synchronize(nil,procedure ()
                begin

                end);


          //task I/O ob task running (0 fetrig, 1 running, 2 soll, 3 nicht gebraucht)
          TaskActiveAr[ tempTHI ] := 0;                                        log(7,'read_ALL_data->TaskActiveAr['+ inttostr(tempTHI) +'] = ' + inttostr( TaskActiveAr[tempTHI] ) + ' end');
        end);
      Tasks[THI].Start;

      delay(100);
      //if ( THI = 11 ) then anyTaskIsRunning := 0;
    end;

davtix 21. Jun 2021 17:07

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

begrenze ich die Threads auf 10, funktioniert alles wie es soll.. :?

bcvs 21. Jun 2021 17:10

AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler
 
Das ist so etwas schwierig zu durchschauen.

- An welcher Stelle wird das THI erstmalig 12? Müsste man mit dem Debugger ja leicht rauskriegen können.
- Pack den Code mal in Delphi-Tags (der Button mit dem Helm) statt Code-Tags
- Wirf alles raus, was nicht zur Reproduktion des Fehlers nötig ist.

davtix 21. Jun 2021 17:25

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

Zitat von bcvs (Beitrag 1491324)
Das ist so etwas schwierig zu durchschauen.

- An welcher Stelle wird das THI erstmalig 12? Müsste man mit dem Debugger ja leicht rauskriegen können.
- Pack den Code mal in Delphi-Tags (der Button mit dem Helm) statt Code-Tags
- Wirf alles raus, was nicht zur Reproduktion des Fehlers nötig ist.


wenn ich diesen ausklammer, funktioniert alles wieder

Delphi-Quellcode:
                  if ( FileExists( tempS ) ) then
                    begin
                      byte := GetFileSize( tempS );
                      tempS1 := konvertBytes( byte );
                      delay(100);
                    end;

DieDolly 21. Jun 2021 17:29

AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler
 
Ich rate mal drauf hin: es liegt an deiner eigenen Delay-Prozedur.

davtix 21. Jun 2021 17:31

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

Zitat von DieDolly (Beitrag 1491327)
Ich rate mal drauf hin: es liegt an deiner eigenen Delay-Prozedur.


Krass, stimmt. Jetzt funktionierts.
Aber warum ?

DieDolly 21. Jun 2021 17:38

AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler
 
Das wissen wir erst, wenn du uns dein Delay zeigst.

davtix 21. Jun 2021 17:41

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

Zitat von DieDolly (Beitrag 1491329)
Das wissen wir erst, wenn du uns dein Delay zeigst.

Delphi-Quellcode:
procedure Delay(const Milliseconds: DWord);
var
  FirstTickCount: DWord;
begin
  FirstTickCount := GetTickCount;
  while ((GetTickCount - FirstTickCount) < Milliseconds) do
  begin
    Application.ProcessMessages;
    Sleep(0);
  end;
end;

DieDolly 21. Jun 2021 17:44

AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler
 
Lass das ProcessMessages weg, dann sollte es funktionieren.
Oder schreibt direkt Sleep(100); in deinen Code statt Delay(100);

noisy_master 22. Jun 2021 07:04

AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 Uhr.
Seite 1 von 2  1 2      

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