AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Semi-Modalen Dialog erstellen

Ein Thema von BigAl · begonnen am 18. Okt 2021 · letzter Beitrag vom 18. Okt 2021
Antwort Antwort
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
498 Beiträge
 
Delphi 12 Athens
 
#1

AW: Semi-Modalen Dialog erstellen

  Alt 18. Okt 2021, 08:07
Hallo Alex,
ich habe das auch nicht überall konsequent so gemacht.
Durch das gelegenliche aufrufen von Application.ProcessMessages wirk dann die Animation von TProgessbar etwas hackelig.
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
515 Beiträge
 
Delphi 12 Athens
 
#2

AW: Semi-Modalen Dialog erstellen

  Alt 18. Okt 2021, 08:19
Das mit dem "hakelig" hängt von der Anwendung ab, bzw. wie oft man es aufruft. Aber es lässt sich halt sehr gut der tatsächlich Fortschritt anzeigen, da man absolut synchron zu der Verarbeitung ist. Üblicherweise sind die Update-Raten bei mir auch sehr hoch. Da wirke ich dann normalerweise damit entgegen, dass ich nur alle 250ms oder so eine tatsächliche Aktualisierung durchführe. Ansonsten verbraucht der Dialog selbst wieder zu viel Rechenzeit.

Eine Idee wäre natürlich nur das "ProcessMessages" intern Thread-gesteuert zu machen. Dann wäre der Dialog immer gut bedienbar, auch wenn mal eine Sekunde kein Update vom Hauptprogramm kommt. Modal ist er ja jetzt, was keine unerwünschten Nebeneffekte mehr zulassen sollte. Auch sollte man das nicht zu oft machen (s.o.), da "ProcessMessages" tweilweise doch relativ viel Rechenzeit in Anspruch nimmt. Allerdings ist das "Cancel" bei mir eh nur für Ausnahmesituationen, welche hoffentlich nie benötigt werden...
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.733 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Semi-Modalen Dialog erstellen

  Alt 18. Okt 2021, 08:37
Nur so am Rande bemerkt: Wenn man Application.ProcessMessages zu oft aufruft, kann das die Verarbeitung extrem verlangsamen.

Ein ex-Kollege von mir (Hi Daniel) hat das mal in eine TimedProcessMessages Funktion gekapselt, die sich merkt, wie lange der letzte Application.ProcessMessages Aufruf her ist und nur dann, wenn er mehr als n Millisekunden (200?) her ist, diese Methode wirklich aufruft. Die Umstellung auf diese Aufrufe hat bei einigen Programmen die Verarbeitung enorm beschleunigt (Faktor 5 bis 10).

Über eine ähnliche Vorgehensweise, und warum man das machen oder nicht machen sollte, habe ich mal geblogt in "Calling Application.ProcessMessages in a Delphi program"
(2018? Unglaublich, dass das schon wieder so lange her ist.)
Thomas Mueller
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
515 Beiträge
 
Delphi 12 Athens
 
#4

AW: Semi-Modalen Dialog erstellen

  Alt 18. Okt 2021, 08:44
Nur so am Rande bemerkt: Wenn man Application.ProcessMessages zu oft aufruft, kann das die Verarbeitung extrem verlangsamen.
Das ist ja dass, was ich oben geschrieben habe. ProcessMessages (sowie die gesamte Aktualisierung der Ausgabe) wird bei mir nur in maximal vorgegebenen Intervallen aufgerufen. Üblicherweise habe ich das 250 ms oder 500 ms drin. Glücklicherweise speichert ja Windows die Botschaften in einer Queue, was dann das Drücken der Taste trotzdem erfasst, auch wenn im ersten Moment kein visuelles Feedback kommt...
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
498 Beiträge
 
Delphi 12 Athens
 
#5

AW: Semi-Modalen Dialog erstellen

  Alt 18. Okt 2021, 08:57
Ich leite alle Dialoge immer von einer eigenen Basisklasse ab.
Hier mal ein vereinfachtes Beispiel für diesem Zweck:
Delphi-Quellcode:
 
TBasicForm = class(TForm)
private
  FStart: Int64;
public
  procedure AntiFreeze; // ruft nur alle 50ms Application.ProcessMessages;
end;

...
procedure TBasicForm .AntiFreeze;
begin
  if FStart = 0 then
    FStart := GetTickCount
  else
    if GetTickCount - FStart > 50 then
    begin
      FStart := GetTickCount;
      Application.ProcessMessages;
    end;
end;
50 Millisekunden habe ich gewählt, damit TProgressbar noch einigermaßen flüssig bleibt.

Bei allem was ich neu schreibe, verwendet das aber nicht mehr.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz