Autor Beitrag
cromos
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 219


Delphi 7
BeitragVerfasst: Mi 01.10.03 19:40 
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.

ausblenden volle Höhe 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


Zuletzt bearbeitet von cromos am Mi 01.10.03 21:04, insgesamt 1-mal bearbeitet
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Mi 01.10.03 19:43 
schreib mal ListView.Begin- und EndUpdate vor- bzw. nach dem For-Statement. Ansonsten brings nicht viel.
grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
cromos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 219


Delphi 7
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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:

ausblenden 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.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
cromos Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 219


Delphi 7
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 219


Delphi 7
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
res := FindNext(ds);
      end;
      FindClose(ds);


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