Autor |
Beitrag |
Mitmischer 1703
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Di 30.10.07 17:39
Was macht Application.ProcessMessages alles? Meines Wissens bremst es ein Programm, damit auf irgendetwas regiert werden kann.  Kann es denn noch etwas anderes??? Und: Gibt es eine Alternative in C++?
Zuletzt bearbeitet von Mitmischer 1703 am Di 30.10.07 17:48, insgesamt 1-mal bearbeitet
|
|
Wolle92
      
Beiträge: 1296
Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
|
Verfasst: Di 30.10.07 17:41
In langen Schleifen, zum Beispiel bei einer Dateisuche, sollte Application.ProcessMessages eingebaut werden, sonst gibt das Programm "Keine Rückmeldung"...
|
|
Mitmischer 1703 
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Di 30.10.07 17:48
Das heißt mit Application.ProcessMessages wird an Windows gemeldet "Ja, ich bin noch da"?
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 30.10.07 17:48
Markieren + F1 hätte es auch getan.
Zitat: | Call ProcessMessages to permit the application to process messages that are currently in the message queue. ProcessMessages cycles the Windows message loop until it is empty, and then returns control to the application.
Note: Neglecting message processing affects only the application calling ProcessMessages, not other applications. In lengthy operations, calling ProcessMessages periodically allows the application to respond to paint and other messages.
Note: ProcessMessages does not allow the application to go idle, whereas HandleMessage does. |
grüße,
Marc
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 30.10.07 17:49
Wolle92 hat folgendes geschrieben: | In langen Schleifen, zum Beispiel bei einer Dateisuche, sollte Application.ProcessMessages eingebaut werden, sonst gibt das Programm "Keine Rückmeldung"... |
Das ist keine Antwort auf die Frage.
Application.ProcessMessages sorgt dafür, dass die Nachrichtenschleife des Fensters abgearbeitet wird.
|
|
Mitmischer 1703 
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Di 30.10.07 17:50
@Marc:
--
@Luckie: D. h., in einer TTimer-Erneuerung sollte das verwendet werden ?!
--
Wie lautet die C++-Variante???
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 30.10.07 18:03
Wenn Du die VCL unter Cpp verwendest: Genauso. 
|
|
Mitmischer 1703 
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Di 30.10.07 18:06
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 30.10.07 18:09
Delphi: Application.ProcessMessages;
Cpp: Application->ProcessMessages();
Wo liegt dein Problem?
grüße,
Marc
|
|
Mitmischer 1703 
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Di 30.10.07 18:12
Wie verwende ich die "VCL" unter C++  . Ist das ein Package oder eine Unit...?
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 30.10.07 18:17
Schau mal hier bei Wiki!
Die Visual Component Library von Borland verwendest Du doch bereits in Delphi.
Visual C++ von Microsoft verwendet dagegen beispielsweiße keine VCL, wie man sich sicherlich denken kann.
[edit]Wir werden langsam ziemlich Off-Topic.
grüße,
Marc
|
|
Mitmischer 1703 
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Di 30.10.07 18:28
Waren das alle Funktionen von application.processmessages?
Zuletzt bearbeitet von Mitmischer 1703 am Fr 28.12.07 21:28, insgesamt 1-mal bearbeitet
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Di 30.10.07 20:00
Mit Application.ProcessMessages wird die Nachrichtenschleife abgearbeitet. Klickst du auf einen Knopf, so gibt es eine Nachricht in die Nachrichtenschlange. Tippst du einen Buchstaben in ein Edit-Feld oder verschiebst das Fenster, gibt's wieder welche. All diese Nachrichten werden automatisch vom Hauptthread abgearbeitet, wenn das Fenster im "Leerlaufzustand" ist. Die Hauptschleife deines VCL-Programmes macht nämlich nichts anderes als Application.HandleMessage aufrufen, bist das Programm wieder geschlossen wird.
Führst du nun eine grössere Berechnung im Hauptthread durch, dann funkt dir Windows nicht in die Berechnung rein um einen Knopfdruck zu interpretieren oder das Fenster zu zeichnen sondern erst wieder beim nächsten Application.ProcessMessages (bzw. HandleMessage). Da HandleMessage erst wieder nach Ende deiner grossen Berechnung ausgeführt wird musst du selbst dafür sorgen, dass die sich anhäufenden Nachrichten abgearbeitet werden, ansonsten reagiert dein Programm nicht mehr auf Mausklicks, usw.
Fazit: Während eines Application.ProcessMessage kann ziemlich alles passieren.
Achtung: Wenn du bspw. auf Knopfdruck eine Berechnung startest und in dieser Berechnung Application.ProcessMessage aufrufst, kann der Knopf zur Berechnung erneut gedrückt werden. Hier musst man etwas aufpassen.
|
|
Mitmischer 1703 
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Di 30.10.07 20:06
Ok! Ich guck mal was HandleMessage macht.  Aber mit ProcessMessages hat sich alles geklärt. Danke!
* Frage beantwortet * (für alle Admins  )
|
|
alias5000
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Mi 31.10.07 18:17
HandleMessage bearbeitet nur eine NAchricht, wobei ProcessMessages alle im Zwischenspeicher nimmt. I.d.R. ist ProcessMessage vorzuziehen!
_________________ Programmers never die, they just GOSUB without RETURN
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mi 31.10.07 22:48
Nicht ganz. Wenn eine Message vorhanden ist, wird sie abgearbeitet, wenn keine Message da ist, wird OnIdle ausgeführt und es blockiert die Applikation bis eine Message ankommt (führt die jedoch nicht aus).
Die zwei Funktionen ProcessMessages und HandleMessage sind nicht für den gleichen Zweck gedacht. HandleMessage wird fast ausschliesslich für Hauptschleifen gebraucht.
|
|
Mitmischer 1703 
      
Beiträge: 754
Erhaltene Danke: 19
Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
|
Verfasst: Do 01.11.07 09:44
Was empfiehlt sich denn?
Z. B. hier:
damit dass Programm noch reagiert, soll man hier
Delphi-Quelltext 1: 2: 3: 4:
| OnClick: begin Sleep (500) end; |
Delphi-Quelltext 1:
| Application.ProcessMessages; |
oder
Delphi-Quelltext
einfügen?
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Do 01.11.07 09:59
HandleMessage habe ich nur beiläufig erwähnt. Das wirst du in deinem eigenen Code nie brauchen. Sleep hat nichts mit Messages zu tun und bringt dein Programm auch nicht dazu, wieder zu reagieren. Damit dein (VCL) Programm in einer längeren Schleife reagiert musst du Messages abarbeiten mit und nur mit Application.ProcessMessages.
Gibt es eine Alternative in C++? Ohne VCL? Schau dir den Source von TApplication.ProcessMessages/TApplication.ProcessMessage (private) an, der lässt sich natürlich auch in C++ nachimplementieren. Es werden vor allem WinAPI Aufrufe getätigt (PeekMessage, TranslateMessage, DispatchMessage).
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Do 01.11.07 11:35
delfiphan hat folgendes geschrieben: | HandleMessage habe ich nur beiläufig erwähnt. Das wirst du in deinem eigenen Code nie brauchen. |
HandleMessage braucht man meines Erachtens dann, wenn man auf ein bestimmtes Ereignis wartet.
Beispiel: While not (Access) do Application.HandleMessage;
ProcessMessage macht hier in der While-Schleife nur wenig Sinn.
grüße,
Marc
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Do 01.11.07 12:50
@Marc.: Natürlich gibt es Anwendungen für HandleMessage, sonst würde die Methode nicht existieren  . Ich habe lediglich (und in diesem Wortlaut) gesagt, dass Mitmischer 1703 diese Methode in seinem eigenen Code nie brauchen wird.
Wenn du HandleMessage in einer While-Schleife hast, dann ist das nichts anderes als eine Hauptschleife. Und, dass das der Hauptverwendungszweck von HandleMessage ist, habe ich 4 Posts weiter oben geschrieben. Die Methode findet man ausser in TCustomForm.ShowModal und Application.Run eigentlich fast nicht (und nein, ich brauche jetzt keine Aufzählung der restlichen Orte  ).
|
|