'beschäftigte' Mainform refreshen

Ich hab eine Schleife in einer ButtonClick Funktion meines Delphi Programms laufen, die etwa 20 Sekunden andauert. Während dieser Zeit wird die Hauptform nicht refresht.

Wenn ich in jedem Schleifendurchgang ein ‚Form1.Refresh;‘ mache, dann funktioniert dies zwar, allerdings dauert die Berechnung dann fast 5 Minuten. Das gleiche passiert, wenn ich mir den Fortschritt der Schleife per ProgressBar anzeigen lasse.

Grüße
Fabian

Versuchs mal, in dem du in die Schleife ein application.processMessages einbaust…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich hab eine Schleife in einer ButtonClick Funktion meines
Delphi Programms laufen, die etwa 20 Sekunden andauert.

Wie oft wird die Schleife denn durchlaufen? 50 Millionen mal?

Während dieser Zeit wird die Hauptform nicht refresht.

So ist es.

Wenn ich in jedem Schleifendurchgang ein ‚Form1.Refresh;‘
mache, dann funktioniert dies zwar, allerdings dauert die
Berechnung dann fast 5 Minuten.

50 Millionen-maliges Refreshen einer Form kostet Zeit, ja.

Was ist zu tun?

  1. Nicht „Form.Refresh“ (macht viel mehr, als Du brauchst), sondern „Application.ProcessMessages“ (bewirkt das, was Du willst, mit kleinstem Aufwand) aufrufen.

  2. „Application.ProcessMessages“ nicht unnötig oft aufrufen. 50 Millionen mal wäre unnötig oft. 5 mal pro Sekunde reicht. Mache aus Deiner Schleife zwei ineinandergeschachtelte, und richte es so ein, daß die äußere etwa 0.2 Sekunden Abarbeitungszeit benötigt. Nur in der äußeren Schleife (!) rufst Du dann „Application.ProcessMessages“ auf. Wenn nicht von vornherein (ungefähr) bekannt ist, wie lange ein Durchlauf der inneren Schleife dauert, bleibt Dir nichts anderes übrig, als zur Runtime des Programms Zeitmessungen durchführen, und dann die Verteilung der Anzahl der Schleifendurchläufe danach zu bemessen (also, ob z. B. 50 * 1000000 oder 5000 * 10000 oder 500000 * 100). Ja, das macht Arbeit, aber wirklich sauberes Programmieren ist leider viel Arbeit. Sch***viel Arbeit, um genau zu sein.

Gruß
Martin

Martin hat schon einen guten Hinweis gegeben.

Ich hab eine Schleife in einer ButtonClick Funktion meines
Delphi Programms laufen, die etwa 20 Sekunden andauert.
Während dieser Zeit wird die Hauptform nicht refresht.

Wenn ich in jedem Schleifendurchgang ein ‚Form1.Refresh;‘
mache, dann funktioniert dies zwar, allerdings dauert die
Berechnung dann fast 5 Minuten. Das gleiche passiert, wenn ich
mir den Fortschritt der Schleife per ProgressBar anzeigen
lasse.

Ja, da hat Martin ja schon gesagt, dass das Refresh zu oft durchläuft.
Die Verschachtelung von 2 Schleifen ist schlicht genial! Aber wenn du das nicht schaffen solltest, gibts auch eine einfachere, aber nicht ganz so saubere Lösung. Du deklarierst einfach eine Variable vom Typ integer (meinetwegen i) und tust mit jedem Schleifendurchgang i um eins erhöhen. Wenn i z.B. 500 erreicht hat (mit if-Anweisung abfragen) setzt du i auf 0 zurück und tust nun dein Fenster refreshen.
Das geht auch schon viel schneller , da so ne Incrementierung weit weniger Rechenzeit benötigt, als wie ein kompletter Refresh bei jedem Durchgang.
Vergiss nicht i vor dem Begin der Schleife 0 zuzuweisen, weil sonst könnte i vielleicht ewig zählen wenn die Abfragebedingung ungünstig ist und i am Anfang (in diesem Bsp.) über 500 sein sollte.

Grüße
Fabian

Gruß zurück
Jenson