![]() |
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; |
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.. :? |
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. |
AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler
Zitat:
wenn ich diesen ausklammer, funktioniert alles wieder
Delphi-Quellcode:
if ( FileExists( tempS ) ) then
begin byte := GetFileSize( tempS ); tempS1 := konvertBytes( byte ); delay(100); end; |
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.
|
AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler
Zitat:
Krass, stimmt. Jetzt funktionierts. Aber warum ? |
AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler
Das wissen wir erst, wenn du uns dein Delay zeigst.
|
AW: For Schleife zählt mehr als vorhanden. iTask, for Schleife, integer -> fehler
Zitat:
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; |
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); |
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 02:09 Uhr. |
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