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
Thema durchsuchen
Ansicht
Themen-Optionen

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 1 von 2  1 2      
davtix

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

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

  Alt 21. Jun 2021, 17:57
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;

Geändert von davtix (21. Jun 2021 um 18:20 Uhr)
  Mit Zitat antworten Zitat
davtix

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

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

  Alt 21. Jun 2021, 18:07
gerade getestet:

begrenze ich die Threads auf 10, funktioniert alles wie es soll..
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 21. Jun 2021, 18:10
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.
  Mit Zitat antworten Zitat
davtix

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

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

  Alt 21. Jun 2021, 18:25
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;
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

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

  Alt 21. Jun 2021, 18:29
Ich rate mal drauf hin: es liegt an deiner eigenen Delay-Prozedur.
  Mit Zitat antworten Zitat
davtix

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

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

  Alt 21. Jun 2021, 18:31
Ich rate mal drauf hin: es liegt an deiner eigenen Delay-Prozedur.

Krass, stimmt. Jetzt funktionierts.
Aber warum ?
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#7

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

  Alt 21. Jun 2021, 18:38
Das wissen wir erst, wenn du uns dein Delay zeigst.
  Mit Zitat antworten Zitat
davtix

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

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

  Alt 21. Jun 2021, 18:41
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;
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#9

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

  Alt 21. Jun 2021, 18:44
Lass das ProcessMessages weg, dann sollte es funktionieren.
Oder schreibt direkt Sleep(100); in deinen Code statt Delay(100);
  Mit Zitat antworten Zitat
noisy_master

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

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

  Alt 22. Jun 2021, 08:04
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;
Dirk
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:38 Uhr.
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