![]() |
Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
Hallo.
Ich habe ein wenig herumgespielt und ein Phänomen entdeckt mit dem ich so nicht gerechnet habe. Habe das nochmal in eine kleine Testapplikation zusammengefasst:
Delphi-Quellcode:
Wenn ich die Anwendung nun starte, sehe ich das der Timer die Variable Count hochzählt und der Wert im Label1 dargestellt wird. Wenn ich nun meinen Button drücke, erscheint der MessageDlg. Die Caption von Label2 wird nicht geändert, bis ich den MessageDlg mit Ok bestätige. Des MessageDlg wird also modal angezeigt und die Ausführung bleibt da stehen.
procedure TForm1.ButtonShowMsgClick(Sender: TObject);
begin MessageDlg('Dlg', mtWarning, [mbOK], 0); Label2.Caption := 'nach Dlg'; end; procedure TForm1.FormCreate(Sender: TObject); begin Counter := 0; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Label1.Caption := IntToStr(Counter); inc(Counter); end; Aber trotzdem läuft der Timer weiter während der MessageDlg angezeigt wird. Im Taskmanager wird angezeigt dass die Anwendung nur einen Thread hat. Wieso ist das so? Vielen Dank |
Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
Ein modales Fenster unterbricht nicht notwendigerweise die Ausführung der restlichen Anwendung, es erlaubt lediglich keine Eingabe in die restliche Applikation. Insofern ist IMHO die OH falsch formuliert.
Denn da steht: Zitat:
|
Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
Es unterbricht schon die komplette Anwendung (korrekt: Den kompletten Thread, aber da es hier nur um einen geht ...)
Allerdings können sich währenddessen Nachrichten "aufstauen" da die Anwendung ja quasi "hängt" also keine Messages abarbeitet. Aber durch den Timer kommen ja ständig Messages dazu, die dann eben warten. Sobald du die Nachricht wegklickst, geht die Nachrichtenschleife weiter und arbeitet alle aufgelaufenen Nachrichten ab. Darunter eben auch die ganzen Timernachrichten. Wenn du im OnTimer die Zeit seit dem letzten Aufruf misst, wirst du feststellen, dass das Intervall auch nicht mehr stimmt (Es werden ja sozusagen die Events aufgearbeitert, die verpasst wurden während die Anwendung angehalten war) |
Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
Kurze Frage: Sind ShowMessage und MessageDlg in diesem Falle vergleichbar?
Denn ich habe vor kurzem die Erfahrung gemacht, dass wenn ich mit ShowMessage und einem Timer einen sich ständig ändernden String ausgebe, dann u.U. (wenn die Message nicht rechtzeitig weggeklcikt wurde) auch mehrere Messages angezeigt werden. Und das zeigt ja wiederum, dass der Timer weiterläuft und das Programm nicht unterbrochen wird... |
Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
@jfheins
das heisst also, dass eine Anwendung, die nur aus einem Thread besteht, keine Nachrichten mehr abholt, wenn ein modaler Dialog geöffnet ist? Also meine Anwendungen arbeiten weiter, sowohl Timer als auch andere Nachrichten. Nur Eingaben sind nicht mehr möglich. Genauso wie Sherlock es schrieb. Wenn es anders wäre, wären modale Dialoge auch kaum einsetzbar. Klaus |
Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
Zitat:
Afaik holt sie keine Nachrichten mehr ab. Aber da es ja die Message-Queue gibt, werden die Messages die die Anwendung bekommt ja nicht weggeschmissen, sondern kommen eben in die Warteschlange. Sobald du nun den Dialog weggeklickt hast, läuft die Anwendung weiter, und arbeitet die Nachrichten ab. Hast du schonmal versucht, ein Fenster zu verschieben, während ein modaler Dialog angezeigt wird? |
Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
Zitat:
:wiejetzt: |
Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
Showmodal schaltet nur das enabled-Flag aller sichtbaren, nonchild Fenster auf False. (Damit werden auch die Child-Windows auf False gesetzt)
Dass bedeutet, dass sonst alles weiterläuft, wie bisher, nur eben die Nachrichten an oben genannte Fenster werden weggeschmissen |
Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
Zitat:
Delphi-Quellcode:
Label2.Caption := 'nach Dlg';
|
Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
Weil du es erst nach dem Schließen des Dialogs aufrufst :gruebel:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 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