Message loop
-
Hallo!
Ist es für Windows eigentlich ein Problem wenn ich die Messages eines Fensters nie abfrage?
Ich brauche nämlich ein Fenster um mit DirectX etwas zu rendern, die Messages interessieren mich aber nicht. Gibt es dann irgendwann einen Overflow (d.h. muss ich trotzdem regelmäßig die Messages einlesen) und kann ich es einfach ignorieren?
Danke schonmal!
mfg
-
kenn mich mit dx nicht so aus, aber wenn du nicht auf die msg reagiert, sprich WM_IRGENDWAS, dann wird sie afaik verworfen.
-
Ja das ist sehrwohl ein Problem. Vor allem wirst du nicht mitbekommen, dass du WM_QUIT erhalten hast. Außerdem musst du auf WM_ACTIVATE acht geben, immerhin kann der User mit ALT+TAB wechseln dann sind alle deine Devices kaputt und müssen nach WM_ACTIVATE wieder resetted werden, etc. etc.
Für DirectX aber PeekMessage() statt GetMessage() verwenden, sonst hast du Probleme bzgl. der Framerate
Andere Möglichkeit ist, die DX-Main-Loop in einen Thread zu stecken und im Hauptthread die GetMessage()-Loop auszuführen. Aber nicht umgekehrt, das geht nicht.
MfG SideWinder
-
Edit: Doppelpost
MfG SideWinder
-
ich ging schon davon aus das er ne loop besitzt in etwa so
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); }
nur das er auf bestimmte msg nicht reagieren möchte (in der msgproc)
-
Nein, es geht mir nur um den Overflow. Dass ich vielleicht durch Alt-TAB das Device verloren habe stelle ich bereits anders fest. Auch Tastatur-Eingaben sind mir egal, da auch dafür DirectX verwende.
Dass ich einige Events nicht mitbekomme nehme ich einfach hin, mit allen Nachteilen die das hat. Ich wollte nur wissen: ist es für Windows ein Problem ist wenn ich nacht nachfrage.
mfg
-
es wäre interessant ob die messages nicht holen möchtest, ala peekmessage oder getmessage, oder einfach nicht darauf reagieren möchtest (in der wndproc).
-
miller_m schrieb:
es wäre interessant ob die messages nicht holen möchtest, ala peekmessage oder getmessage, oder einfach nicht darauf reagieren möchtest (in der wndproc).
Er will sich die Message-Loop komplett ersparen.
BTW: Möchte ich wissen wie du performant mitkriegst, dass du wieder resetten musst?!
MfG SideWinder
-
SideWinder schrieb:
Er will sich die Message-Loop komplett ersparen.
konnt ich nicht rauslesen
SideWinder schrieb:
BTW: Möchte ich wissen wie du performant mitkriegst, dass du wieder resetten musst?!
würde mich auch interessieren.
-
Die Present-Methode von DirectX gibt D3DERR_DEVICELOST zurück wenn das Device zurückgesetzt werden muss.
Es geht mir dabei nicht um die Performance, sondern darum, dass das ganze auch unter OpenGL und letztendlich auf anderen Plattformen laufen soll (dabei dann natürlich nur unter OpenGL und nicht DirectX). Und dabei kann ich sowas betriebssystemspezifisches wie die Message-Loop nicht brauchen.
Nachdem wir vom Thema abkommen möchte ich noch einmal fragen: Weiß jemand eine sichere Antwort? Ich will nicht nur die Ereignisse ignorieren, sondern die Message-Loop ganz weglassen. Es funktioniert alles schon wunderbar, ich möchte nur wissen ob ich trotzdem noch die Event-Warteschleife leeren muss.
mfg
-
Christoph R. schrieb:
Die Present-Methode von DirectX gibt D3DERR_DEVICELOST zurück wenn das Device zurückgesetzt werden muss.
Das sagt dir bloß, wenn du es verloren hast. Dann andauernd zu resetten versuchen halte ich nicht für optimal.
Es geht mir dabei nicht um die Performance, sondern darum, dass das ganze auch unter OpenGL und letztendlich auf anderen Plattformen laufen soll (dabei dann natürlich nur unter OpenGL und nicht DirectX). Und dabei kann ich sowas betriebssystemspezifisches wie die Message-Loop nicht brauchen.
Du wirst aber trotzdem eine WinMain() brauchen, die wird unter Linux auch nicht funktionieren. Was tun? Richtig, für Windows wird die winmain.cpp erstellt mit WinMain() und MessageLoop() -> die unabhängige Engine wird in einem Thread gestartet. Für Linux machst du eine linuxmain.cpp fertig.
MfG SideWinder
-
Christoph R. schrieb:
Nachdem wir vom Thema abkommen möchte ich noch einmal fragen: Weiß jemand eine sichere Antwort? Ich will nicht nur die Ereignisse ignorieren, sondern die Message-Loop ganz weglassen. Es funktioniert alles schon wunderbar, ich möchte nur wissen ob ich trotzdem noch die Event-Warteschleife leeren muss.
ich bleibe dabei, mit 99prozentiger sicherheit, das du sie nicht leeren musst. sonst würde ja windows alle paar minuten abschirmen (grubbel macht es das nicht
)
SideWinder schrieb:
Du wirst aber trotzdem eine WinMain() brauchen, die wird unter Linux auch nicht funktionieren. Was tun? Richtig, für Windows wird die winmain.cpp erstellt mit WinMain() und MessageLoop() -> die unabhängige Engine wird in einem Thread gestartet. Für Linux machst du eine linuxmain.cpp fertig.
so wie jeder anderes dieses auch macht, auch meine wenigkeit. dann gibt es noch ein paar defines und typedes und die sache ist perfekt.
-
Microsoft Windows XP: If a top-level window stops responding to messages for more than several seconds, the system considers the window to be not responding. In this case, the system hides the window and replaces it with a ghost window that has the same Z order, location, size, and visual attributes. This allows the user to move it, resize it, or even close the application. However, these are the only actions available because the application is actually not responding. When in the debugger mode, the system does not generate a ghost window.
An application must remove and process messages posted to the message queues of its threads.
Ansonsten ist die Messagequeue irgendwann voll und nimmt keine neuen Nachrichten mehr auf. Im Petzold steht IIRC auch wieviele Nachrichten sie aufnehmen kann. Es waren glaub irgendwas zwischen 2000 und 20000.
-
Kann man glaube ich in der Registry festlegen.