AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?
Thema durchsuchen
Ansicht
Themen-Optionen

Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?

Ein Thema von Viktorii · begonnen am 17. Okt 2008 · letzter Beitrag vom 17. Okt 2008
Antwort Antwort
Seite 1 von 2  1 2      
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#1

Wieso läuft Timer weiter wenn MessageDlg gezeigt wird?

  Alt 17. Okt 2008, 10:57
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
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 17. Okt 2008, 11:05
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
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

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

  Alt 17. Okt 2008, 13:52
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)
  Mit Zitat antworten Zitat
Sven M.

Registriert seit: 21. Okt 2006
Ort: Halle/Saale
106 Beiträge
 
Delphi 5 Enterprise
 
#4

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

  Alt 17. Okt 2008, 14:22
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...
  Mit Zitat antworten Zitat
DelphiKlaus

Registriert seit: 18. Okt 2006
100 Beiträge
 
Delphi 6 Professional
 
#5

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

  Alt 17. Okt 2008, 14:23
@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
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

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

  Alt 17. Okt 2008, 14:35
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?
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#7

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

  Alt 17. Okt 2008, 15:00
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?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

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

  Alt 17. Okt 2008, 15:03
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
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#9

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

  Alt 17. Okt 2008, 15:11
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?

Label2.Caption := 'nach Dlg';
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

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

  Alt 17. Okt 2008, 15:18
Weil du es erst nach dem Schließen des Dialogs aufrufst
Zitat:
Delphi-Quellcode:
MessageDlg('Dlg', mtWarning, [mbOK], 0);
Label2.Caption := 'nach Dlg';
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:03 Uhr.
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