Autor Beitrag
Mitmischer 1703
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1296

Windows Vista Home Premium
Delphi 7 PE, Delphi 7 Portable, bald C++ & DirectX
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Di 30.10.07 17:48 
Das heißt mit Application.ProcessMessages wird an Windows gemeldet "Ja, ich bin noch da"?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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



BeitragVerfasst: Di 30.10.07 17:49 
user profile iconWolle92 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Di 30.10.07 17:50 
@Marc: :nixweiss: :mrgreen:

--

@Luckie: D. h., in einer TTimer-Erneuerung sollte das verwendet werden ?! :|

--

Wie lautet die C++-Variante???
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Di 30.10.07 18:03 
Wenn Du die VCL unter Cpp verwendest: Genauso. ;)
Mitmischer 1703 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Di 30.10.07 18:06 
:?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Di 30.10.07 18:09 
Delphi: Application.ProcessMessages;
Cpp: Application->ProcessMessages();

Wo liegt dein Problem?

grüße,
Marc
Mitmischer 1703 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Di 30.10.07 18:12 
Wie verwende ich die "VCL" unter C++ :oops:. Ist das ein Package oder eine Unit...?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Di 30.10.07 18:17 
Schau mal hier bei Wiki! :P
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: 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 :tongue:)
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 754
Erhaltene Danke: 19

Win 7, Debian
Delphi Prism, Delphi 7, RAD Studio 2009 Academic, C#, C++, Java, HTML, PHP
BeitragVerfasst: Do 01.11.07 09:44 
Was empfiehlt sich denn?

Z. B. hier:

damit dass Programm noch reagiert, soll man hier

ausblenden Delphi-Quelltext
1:
2:
3:
4:
OnClick:
begin
Sleep (500)
end;


ausblenden Delphi-Quelltext
1:
Application.ProcessMessages;					

oder
ausblenden Delphi-Quelltext
1:
Handlemessages					


einfügen?
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 01.11.07 11:35 
user profile icondelfiphan 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 01.11.07 12:50 
@Marc.: Natürlich gibt es Anwendungen für HandleMessage, sonst würde die Methode nicht existieren :roll:. 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 ;)).