Entwickler-Ecke

Sonstiges (Delphi) - cpu voll auslastung ..


Niko S. - Mo 17.07.06 14:04
Titel: cpu voll auslastung ..
Also ich hab ein kleines Programm geschireben, was eigendlich nur ein ablauf macht .. sone for schleife die ca 2600 mal wiederholt wird.
Das Programm frisst aber den ganzen CPU auf und wenn man nebenbei etwas macht scheint das Programm abzuschmieren.
Weiß einer wie ich den cpu verbrauch mindern kann? bzw. begrenzen kann?


crowley - Mo 17.07.06 14:08

na, es kommt ganz darauf an, was du in deiner schleife machst ;)


Gausi - Mo 17.07.06 14:13

Wieso willst du den CPU-Verbrauch vermindern? Wenn dein Programm rechnen will, und der Computer grade nichts anderes zu tun hat, dann lass den doch mal auf Hochtouren laufen...:D

Zu deinem Problem: Pack mal in deine Schleife alle paar Durchläufe ein Application.ProcessMessages rein. Das sorgt dafür, dass deine Anwendung bedienbar bleibt und nicht "einfriert".
Besser wäre es aber wahrscheinlich, da du relativ wenige Durchgänge hast, die aber scheinbar schon recht lange dauern, wenn du die Berechnung in einen Thread auslagern würdest...


Niko S. - Mo 17.07.06 14:52

Nagut aber ist ein wenig spaggetti text ^^ ich habs noch nicht formatiert wollte es erst zum laufen bekommen xD und bin ein relativer neuling ^^


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:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
procedure TForm1.Button2Click(Sender: TObject);
var times,i,rest,ids,lines:Integer;
begin
lines := memo1.Lines.Count;
progressbar1.Max := lines;
button1.Enabled := false;
button2.Enabled := false;
for i:= 1 to lines do
begin
combobox1.ItemIndex := combobox1.itemindex +1;
edit24.Text := combobox1.items[combobox1.itemindex];
if ((Pos('/',edit24.Text) = 1OR (edit24.text = '')) then
begin
combobox1.ItemIndex := combobox1.itemindex +1;
edit24.Text := combobox1.items[combobox1.itemindex];
progressbar1.position := progressbar1.position+1;
end
else begin

ids := Pos(',',edit24.text)-1;
edit2.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit3.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit4.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit5.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit6.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit7.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit8.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit9.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit10.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit11.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit12.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit13.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit14.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit15.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit16.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit17.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit18.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit19.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit20.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit21.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);
ids := Pos(',',edit24.text)-1;
edit22.Text := Copy(edit24.text,1,ids);
rest := Pos(',',edit24.text)+1;
edit24.Text := Copy(edit24.text,rest,999);

edit23.Text := Copy(edit24.text,1,999);


if ((edit5.text = '4'OR (edit5.text = '5')) then
begin
edit12.text := edit1.text;
edit25.text := edit2.text +','+edit3.text+','+edit4.text+','+edit5.text+','+edit6.text+','+edit7.text+','+edit8.text+','+edit9.text+','+edit10.text+','+edit11.text+','+edit12.text+','+edit13.text+','+edit14.text+','+edit15.text+','+edit16.text+','+edit17.text+','+edit18.text+','+edit19.text+','+edit20.text+','+edit21.text+','+edit22.text+','+edit23.text;
Memo1.Lines.Strings[combobox1.itemindex] := edit25.Text;
times := times +1;
end;

progressbar1.position := progressbar1.position+1;
end;
if (ProgressBar1.position = ProgressBar1.Max) then
begin
button1.Enabled := True;
button2.Enabled := True;
Memo1.Lines.SaveToFile(opendialog1.filename);
label1.caption := inttostr(times);
end;

end;

end;

ich muss das nacher noch sortieren und auskommentieren ;P
Die datei die er einliest ist ca 2600 zeilen kann wie schon gesagt
------
Und Sorry wegen rechtschreibung ich achte da nicht so drauf


Sy- - Mo 17.07.06 15:21

Also du kannst es stabiler gestalten, indem du einfach in der schleife application.processmessages; machst
Damit sollte normal nichts abstürzen, ist meist nur eine vermutung, weil kein feedback vom Prog kommt

Ich würde an deiner stelle auch möglichst variablen benutzen, die nicht dargestellten werden
wie bei dir zB dein Memo oder die Textfelder
dann würde es noch 100x schneller laufen.

-> TStringlist
-> Strings

Gruß


Delete - Mo 17.07.06 20:02

user profile iconSy- hat folgendes geschrieben:
Also du kannst es stabiler gestalten, indem du einfach in der schleife application.processmessages; machst

Auch Application.ProcessMessages korrigiert die Schleife nicht. :roll:


Delphi-Quelltext
1:
for i := 0 to lines - 1 do                    

muss es heißen.

user profile iconSimak hat folgendes geschrieben:
Nagut aber ist ein wenig spaggetti text ^^ ich habs noch nicht formatiert

Aber wir sollen uns da jetzt zurecht finden und durch wühlen?


Sy- - Di 18.07.06 16:52

Was soll da korrigiert werden?
Soll nur stabiler laufen bzw. eigentlich weniger cpu fressen.

Und wie kommst du nun auf die voreilige idee, dass es
for i := 0 to lines - 1 do
heißen soll?
der benutzt i garnicht, außer zum hochzählen und dafür passt es bereits.

Du verwirrst den ja noch :wink:

Wenn was an der geschwindigkeit verbessert werden soll - klappen tut es ja
soll er alle variablen auf variablen tun statt auf kompos.

Kurze Anmerkung:
Da du ja noch neu bist kannste eigentlich das ganze mal so ausprobieren,
dass du visible:=false auf alle kompos stellst, also sprich nicht anzeigen lässt (die textfelder und memos die sich die ganze zeit ändern)
Das würde das ganze auch schon stark beschleunigen.
Wenns sein muss kannste auch alle zum schluss wieder einblenden lassen.


Niko S. - Di 18.07.06 20:20

passt alles das mit dem prozess dings klappt auch damit das ding nid mehr einfriert ^^

und ich hab das schon alles visible := false; hab ich auch alles ^^
danke trozdem

(mit nem 1,3 ghz und 512mb ram kommt nicht viel leistung xD mit meinem neuen pc geht das was uf den alten in 3 minuten war in 3 sekunden xD)