Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - 94 % Systemauslastung[done]


cromos - Mi 01.10.03 19:40
Titel: 94 % Systemauslastung[done]
Hallo.

Ich habe ein Problem: In einem ListView sind Ordnernamen
aufgeführt. Die sollen mittels einer Schleife durchlaufen werden.
inerhalb dieser Schleife läuft eine andere. Diese sucht alle Dateien die
sich in dem betreffenden Ordern befinden und übergibt diese an eine Listbox.
Das Problem. Das Programm verursacht 94% Systemauslastung.
Das liegt an der Schleife die die Dateien sucht.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
procedure TForm17.FormCreate(Sender: TObject);
var sl2: TStringList;
var sli,lbi,lvp,res : integer;
var ProgrammOrdner,IniPak2,gp : String;
ini : TIniFile;
ListItem: TListItem;
ds: TSearchRec;
begin
//pg1.Position := 20;
lblZuSuchen.Caption := form1.txtSuch.Text;
{Ini Suchpakete auslesen}
ProgrammOrdner:=ExtractFilePath(application.ExeName);
ini:=TIniFile.Create(ProgrammOrdner +'\est_term.ini');
  Try
    IniPak2 := ini.ReadString('Erweiterte Suche','Pakete','default');
  Finally
    Ini.Free;
  end;

  sl2:=TStringList.Create;
        try
          sl2.Delimiter:=',';
          sl2.DelimitedText:=IniPak2;
            for sli := 0 to sl2.Count - 1 do
              begin
                ListView1.Items.BeginUpdate;
                ListItem := ListView1.Items.Add;
                ListItem.Caption := sl2[sli];
                ListView1.Items.EndUpdate;
                {ListItem.SubItems.Add(Anrede);
                ListItem.SubItems.Add(NameA);}

              end;
        finally
          sl2.Free;
        end;
{Pakete Durchsuchen - 1.Paketnamen,2.Die einzelnen Dateien in den Ordnerm(Pakete),3.Den Suchstring}
  for lvp := 0 to ListView1.Items.Count - 1 do
    gp := listView1.Items.Item[lvp].Caption;  {gp = Ordnername}

    res := FindFirst(ProgrammOrdner + 'Data\' + gp +'\*.estt',faAnyFile,ds);
    while(res =0do begin {ds.name = Datei}
      listBox1.Items.add(ds.Name);
     end;

end;


Woran liegt das?? Bzw. wie kann ich das ändern. Das die Dateien in eine Listbox kommen ist nur Probeweise. Ich will die Dateien später alle einzeln nach einem String durchsuchen lassen.
:?: :?:

Gruss
Cromos


MSCH - Mi 01.10.03 19:43

schreib mal ListView.Begin- und EndUpdate vor- bzw. nach dem For-Statement. Ansonsten brings nicht viel.
grez
msch


cromos - Mi 01.10.03 19:58

Zitat:

schreib mal ListView.Begin- und EndUpdate vor- bzw. nach dem For-Statement. Ansonsten brings nicht viel.


Wie jetzt? Also habe das mal gemacht. Aber soweit lief ja alles wunderbar.
Das Proplem fing an, als diese Routine dazu kam:


Delphi-Quelltext
1:
2:
3:
4:
res := FindFirst(ProgrammOrdner + 'Data\' + gp +'\*.estt',faAnyFile,ds); 
    while(res =0do begin {ds.name = Datei} 
      listBox1.Items.add(ds.Name); 
     end;


Diese soll nämlich alle Dateien suchen und in die Listbox packen.
Also mit End- und Begin Update hat das nix zu tun???!!!!!

Gruss
Cromos


tommie-lie - Mi 01.10.03 20:34
Titel: Re: 94 % Systemauslastung
MSCH meint, du sollst Begin- und End-Update nicht IN die Schleife machen, sondern davor und dahinter:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
          sl2.Delimiter:=',';
          sl2.DelimitedText:=IniPak2;
          ListView1.Items.BeginUpdate;
            for sli := 0 to sl2.Count - 1 do
              begin
                ListItem := ListView1.Items.Add;
                ListItem.Caption := sl2[sli];
                {ListItem.SubItems.Add(Anrede);
                ListItem.SubItems.Add(NameA);}

              end;
          ListView1.Items.EndUpdate;

Sonst wird ja bei jedem Schleifendurchlauf der Listview trotzdem gezeichnet, was natürlich genauso viel bringt, wie wenn du Begin- und EndUpdate gar nicht benutzen würdest.


cromos - Mi 01.10.03 20:55

Hallo,

das mit dem Begin und EndUpdate hat nicts zu sagen. Hab es jetzt zwar mal so umgesetzte, aber bis dahin lief ja vorher auch alles Problemlos.

Dieser Code ist es der die Probleme bereitet:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
{Pakete Durchsuchen - 1.Paketnamen,2.Die einzelnen Dateien in den Ordnerm(Pakete),3.Den Suchstring} 
  for lvp := 0 to ListView1.Items.Count - 1 do 
    gp := listView1.Items.Item[lvp].Caption;  {gp = Ordnername} 

    res := FindFirst(ProgrammOrdner + 'Data\' + gp +'\*.estt',faAnyFile,ds); 
    while(res =0do begin {ds.name = Datei} 
      listBox1.Items.add(ds.Name); 
     end;


Er verursacht die 94%. und zwar genauer gesagt ab dem
res := .......

Kann mir jemand helfen?

Gruss
Cromos


cromos - Mi 01.10.03 21:04
Titel: Ahrrrrr
:oops: :oops: :oops: :oops:

Oh man, ich hab den Wald vor lauter Bäumen nicht gesehen.
War mein Fehler.
hatte:

Delphi-Quelltext
1:
2:
3:
res := FindNext(ds);
      end;
      FindClose(ds);


vergessen. :? :? :oops: :oops: :oops:
Sorry. Jetzt läuft es wie es sein soll.