Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wieso läuft Timer weiter wenn MessageDlg gezeigt wird? (https://www.delphipraxis.net/122508-wieso-laeuft-timer-weiter-wenn-messagedlg-gezeigt-wird.html)

Viktorii 17. Okt 2008 09:57


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:
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;
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.
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

Sherlock 17. Okt 2008 10:05

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:

Mit ShowModal können Sie ein Formular modal anzeigen. Da bei einem modalen Formular die Anwendung unterbrochen wird, bis der Benutzer das Fenster wieder schließt, gibt ShowModal die Steuerung erst nach dem Schließen des Formulars zurück. Dabei wird auch der Wert der Eigenschaft ModalResult zurückgegeben.
Sherlock

jfheins 17. Okt 2008 12:52

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)

Sven M. 17. Okt 2008 13:22

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...

DelphiKlaus 17. Okt 2008 13:23

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

jfheins 17. Okt 2008 13:35

Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
 
Zitat:

Zitat von DelphiKlaus
@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

Was verstehst du unter "weiterarbeiten" ?

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?

Viktorii 17. Okt 2008 14:00

Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
 
Zitat:

Zitat von jfheins
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.

Das verstehe ich jetzt nicht ganz. Wie ich schon geschrieben habe, wird die Timer Routine weiter ausgeführt während der MessageDlg noch da ist bzw. noch bevor ich den Dialog weggeklickt habe.... Also werden die Messages doch trotz dem Dialogs abgearbeitet, oder?
:wiejetzt:

sirius 17. Okt 2008 14:03

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

Viktorii 17. Okt 2008 14:11

Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
 
Zitat:

Zitat von sirius
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

Wenn das so ist, wieso sehe ich dann das Ergebniss dieser Zeile erst nach dem Schließen des Dialog?

Delphi-Quellcode:
Label2.Caption := 'nach Dlg';

sirius 17. Okt 2008 14:18

Re: Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
 
Weil du es erst nach dem Schließen des Dialogs aufrufst :gruebel:
Zitat:

Delphi-Quellcode:
MessageDlg('Dlg', mtWarning, [mbOK], 0);
Label2.Caption := 'nach Dlg';



Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz