Delphi-Forum.de Delphi-Library.de
C-Sharp-Forum.de C-Sharp-Library.de
Registrieren Login Suche Hilfe Sitemap
Bubblesort -> Fortschrittsanzeige via Progressbar
spacer
Autor Nachricht
theevilworm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star

Beiträge: 52
Dabei seit: 23.10.2009



BeitragVerfasst: Mi 10.03.10 17:44  Antworten mit Zitat Beitrag melden
Guten Tag zusammen,

in der Schule behandeln wir gerade Sortieralgorithmen. Ich habe schon mal in mein "Sortierprogramm" zwei Algorithem implementiert, Auswahlsort und Bubblesort. Der User kann eine Zahl angeben, und so viele Zufallszahlen werden im Bereich 0..10000 generiert und in einem Memo ausgegeben. Nach der Wahl der Soriermethode sollen die Zahlen sortiert und in einem zweiten Memo ausgegeben werden.
Das Sortieren klappt perfekt, auch wenn es etwas lange dauert (2000 Zufallszahlen sortieren: 40 sek, bei aktuellem System. Dachte, das wäre eine Sache von ein paar Milisekunden!). Nun wollte ich mein Programm noch verschönern und den Fortschritt der Sortierung mit einem Progressbar anzeigen lassen.

Mein Code sieht so aus (nur Bubblesort, bei Auswahlsort ist das gleiche Problem)

ausblenden volle Höhe Delphi-Quelltext markieren
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 TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
memo1.text:='';
progressbar1.Position:=0;
zaehler:=strtointdef(edit1.text,3);
randomize;
for i:=1 to zaehler do //Array mit zu sortierenden Zufallszahlen füllen
begin
application.processmessages;
meinarray[i]:=Random(10000);
memo1.Text:=memo1.text+IntToStr(meinarray[i])+', ';
end;
end;

procedure TForm1.ButtonBubblesort(Sender: TObject);
var i,k,ablage:integer;
begin
memo2.text:='';

For i:=1 to zaehler do //Bubble-Sort
begin
application.processmessages;
For k:=1 to zaehler-1 do
begin
application.processmessages;
If meinarray[k]>meinarray[k+1] then
begin
ablage:=meinarray[k];
meinarray[k]:=meinarray[k+1];
meinarray[k+1]:=ablage;
end;
application.processmessages;
end;
application.processmessages;
end;

For i:=1 to zaehler do //Ausgabe der sortierten Zahlen
begin
memo2.text:=memo2.text+IntToStr(meinarray[i])+', ';
progressbar1.Position:=i;
application.processmessages;
end;

end;


Das Problem: Der Progressbar bewegt sich zwar, aber hängt total hinterher - wenn der Balken voll ist, ist mein Programm noch am Ausgeben der Zahlen, sprich, der Scrollbalken des zweiten Memofeldes schrumpft noch immer, es werden also noch Zahlen reingeschrieben.

Wie kann ich den Progressbar jetzt synchronisieren, sodass er erst dann fertig ist, wenn mein Programm fertig ist?


Edit: *Kopf -> Tisch* Ich hab ja vergessen, progressbar1.max auf zaehler zu setzen. Ich hab noch dran gedacht, dass ich das machen muss, als ich die Idee hatte, und jetzt im Code vergess ichs. Doof!

Dann ist ja diese Frage immerhin geklärt - darf ich dann eine andere stellen? Ich habe extra überall application.processmessages reingetan, damit sich bei vielen Zahlen das Programm nicht so aufhängt. Ich kann das Fenster jetzt also während dem Sortieren nett bewegen, aber Schließen funkioniert nicht. Das Programm wird erst geschlossen, wenn es fertig soriert hat!


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 11.03.2010 um 11:20
Private Nachricht sendenPosting in privater Nachricht zitieren
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star

Beiträge: 2458
Erhaltene Danke: 2
Dabei seit: 16.02.2005



BeitragVerfasst: Mi 10.03.10 19:29  Antworten mit Zitat Beitrag melden
Du musst den maximalen Wert der ProgressBar setzen. Application.ProcessMessages entfernen und über Threads lösen. Mehr als ein paar Millisekunden dürfte es auch nicht dauern. Du hast einige sehr teure Operationen in deinem Code (Application.ProcessMessages und String-Konkatenierung des Text-Propertys einer Liste; Die Fortschrittanzeige brauchst du gar nicht, wenn du die teuren Operationen weglässt bzw. umschreibst).
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
theevilworm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star

(Threadstarter)

Beiträge: 52
Dabei seit: 23.10.2009



BeitragVerfasst: Mi 10.03.10 21:57  Antworten mit Zitat Beitrag melden
Ich versteh nur Bahnhof?! String-Konkatenierung? Text-Property? Und ich weiß zwar grob, was Threads sind, aber das haben wir noch nicht mal ansatzweise angesprochen... Unser Lehrer hat gerade mal mit Arrays begonnen.
Private Nachricht sendenPosting in privater Nachricht zitieren
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star

Beiträge: 3145
Erhaltene Danke: 10
Dabei seit: 28.12.2005
Wohnort: Österreich, Wien

Windows Vista
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mi 10.03.10 22:13  Antworten mit Zitat Beitrag melden
String-Konkatenierung ist sowas zum Beispiel: MeinString := MeinString + 'noch was dran'; Also einfach das zusammenfügen von Strings. ;)

Property ist eine Eigenschaft. Also die Text-Eigenschaft. Also Memo1.Text. ;)

Langsam ist dies deswegen weil einerseits die Stringkonkatenation nicht gerade die schnellste ist und außerdem du auf die Eigenschaft von einem VCL-Object zugeifst, was auch noch Geschwindigkeit kostet.

lg elundril

_________________
"Und warum studierst du Informatik?" - "Weil ich gerne Computerspiele spiele, programmieren hass ich eigentlich." *wallbash*
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star

Beiträge: 2458
Erhaltene Danke: 2
Dabei seit: 16.02.2005



BeitragVerfasst: Mi 10.03.10 22:45  Antworten mit Zitat Beitrag melden
-Füge eine lokale Variable s hinzu (beide Methoden).
-Ersetze in den Methoden memo1.text bzw memo2.text durch s
-Memo1.Text := s; bzw. Memo2.Text := s; am Schluss der Methoden.
-Entferne die Progressbar
-Entferne Application.ProcessMessages

Ist zwar immer noch Stringkonkatenierung und insgesamt immer noch nicht effizient aber bestimmt eine ganze Menge schneller.
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
theevilworm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star

(Threadstarter)

Beiträge: 52
Dabei seit: 23.10.2009



BeitragVerfasst: Do 11.03.10 09:55  Antworten mit Zitat Beitrag melden
Guten Morgen,

danke für eure Ratschläge, ich werde das zuhause mal so ändern. Im Moment bin ich aber in der Schule, und ich habe mein Programm von zuhause auf einem USB-Stick mit in die Schule gebracht und -ohne Änderungen- hier ausgeführt.

Das macht mir Angst: Zuhause hat mein eigentlich recht schneller Rechner für das Generieren von 2000 Zahlen fast eine ganze Minute gebraucht.
Hier auf dem gammligen Schulrechner brauche ich nur wenige Sekunden!

Mein System:
E8400 @ 3GHz (Boxed)
Club3D HD4850 Overclocked
6GB RAM von Corsair (XMS2 und TwinX)
be quiet! 400W Netzteil
MSI P35 Neo-FR

Der Schulrechner (genau Angaben kann ich nicht geben, mir fehlen die recht für den Gerätemanager):

AMD Athlon(tm) 64 X2 Dual
Core Processor 4400+
2.3 GHz, 896 MB RAM
Physikalische Adresserweiterung

Warum brauche ich länger? Mein Rechner schlägt den Schulrechner doch wohl um Längen!?
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star

Beiträge: 11091
Erhaltene Danke: 37
Dabei seit: 22.10.2003
Wohnort: Erde (Milch- straße) ;-), ok, ok: Berlin

(XP), Vista Business, W7 (Chrome, Op10, IE8)
D2006 Pro, Java (Eclipse), C++, C# (VS 2008 Prof), Lazarus
BeitragVerfasst: Do 11.03.10 10:34  Antworten mit Zitat Beitrag melden
user profile icontheevilworm hat folgendes geschrieben Zum zitierten Posting springen:
Das macht mir Angst: Zuhause hat mein eigentlich recht schneller Rechner für das Generieren von 2000 Zahlen fast eine ganze Minute gebraucht.
Hier auf dem gammligen Schulrechner brauche ich nur wenige Sekunden!
[..]
Warum brauche ich länger? Mein Rechner schlägt den Schulrechner doch wohl um Längen!?
Das kann einerseits am Betriebssystem liegen, bei solchen wiederholten grafischen Ausgaben sind z.B. Vista oder Windows 7 teilweise deutlich schneller als Windows XP, das habe ich mal getestet.

Andererseits laufen oft auf einem privaten PC viele Programme im Hintergrund, die Leistung fressen. Dadurch hat man dann am Ende mit einem besseren PC weniger Leistung übrig.

_________________
Alle meine Projekte ruhen derzeit und bis auf weiteres aus beruflichen Gründen!
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
theevilworm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star

(Threadstarter)

Beiträge: 52
Dabei seit: 23.10.2009



BeitragVerfasst: Do 11.03.10 18:32  Antworten mit Zitat Beitrag melden
Auf den Schulrechnern läuft Windows NT, bei mir Win7 Ultimate 64bit.
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Beiträge vom vorherigen Thema anzeigen:   
home home