PeekMessage und GetMessage (horror)
-
Hi,
ich hab das problem wenn ich mein Programm minimiere, dass es dann trotzdem noch 100% Prozessorauslastung braucht, grund dafür ist PeekMessage die ich jedoch brauche wenn das Fenster aktiv ist.
Jetzt hab ich mir gedacht, wenn das Fenster minimiert ist, dass es dann nur GetMessage benutzen soll um halt zu gucken ob das Fenster wieder aktiviert wurde, also Maximiert wurde.
Doch der ganze scheiss will nicht richtig
Hier mein code:
// Sprungnote here: // mit GetMessage Nachrichten abfangen while (::GetMessage (&msg, NULL, 0, 0, PM_REMOVE)) { // ist die Nachricht die, dass das Fenster Geöffnet ist. while (msg.message == WM_ACTIVATEAPP) { // normal per PeekMessage Nachrichten abfragen (100% auslastung) if (::PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { // Ist die Nachricht das gegenteil von WM_ACTIVATEAPP, // dann zur Sprungmarke springen if (msg.message != WM_ACTIVATEAPP) { goto here; } ::TranslateMessage (&msg); ::DispatchMessage (&msg); } else { // Rendern // Input verarbeiten // Ganzen DirectX scheiss usw. } } }
Bitte bitte helft mir
ich bekomm dabei noch die kriese
-
sieht aus, als ob das ne game loop sein soll!?
meine sieht so aus:bool run = true; //Spiel läuft MSG msg; while( run ) { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) { if( msg.message == WM_QUIT ) run = false; TranslateMessage( &msg ); DispatchMessage( &msg ); } //Rendern etc. } //Aufräumen
-
ist ja auch ne gameloop, hab ich doch gesagt?
Doch les mal was ich genau will! wenn das dingen minimiert ist braucht der mist trotzdem noch 100% Prozessor dank PeekMessage, obwohl das absolut nicht nötig ist. drum GetMessage + PeekMessage aber dieser elende schwachsinn will nicht!
-
Irgendwi kam bei mir das WM_ACTIVATEAPP in der Anwendung nie an (obwohl es in Spy++ angezeigt wurde
) - deshalb hier mal eine Lösung mit IsIsonic:
BOOL run = TRUE; BOOL active = FALSE; while( run ) { active = !IsIconic(hwnd); if((active && PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )) || (!active && GetMessage (&msg, NULL, 0, 0))) { TranslateMessage( &msg ); DispatchMessage( &msg ); } if(active) { // rendern } if( msg.message == WM_QUIT ) { run = FALSE; } }
-
sobald du GetMessage() drin hast, wartet deine anwendung auf eine nachricht -> extrem schlecht für die Performance.
also ich würd GetMessage() nur während active == false is verwenden.bool run = true; //Spiel läuft MSG msg; while( run ) { while( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) { if( msg.message == WM_QUIT ) { run = false; break; } TranslateMessage( &msg ); DispatchMessage( &msg ); } //Rendern etc. } //Aufräumen
soweit ich mich erinnern kann, verwendet Stefan Zerbst diese GameLoop.
-
Ach benutz PeekMessage und WaitMessage wenn die Anwendung minimiert ist!!
-
dot, sag mal hast du den knall nicht mitbekommen oder nicht gelesen?
flenders hat doch die lösung schon gepostet, man bist du dämlich...
-
Was auch hilft ist ein Sleep(10) reinpacken. Das bringt bei mir die CPU Auslastung auf etwa 2% und die kommen nicht von meinem Prog.
-
Irgendwer schrieb:
Was auch hilft ist ein Sleep(10) reinpacken. Das bringt bei mir die CPU Auslastung auf etwa 2% und die kommen nicht von meinem Prog.
Ja toll, vor allem bei schnellen Renderszenen ist das sehr hilfreich lol
MfG SideWinder
-
Irgendwer schrieb:
Was auch hilft ist ein Sleep(10) reinpacken. Das bringt bei mir die CPU Auslastung auf etwa 2% und die kommen nicht von meinem Prog.
Depp
-
@sidewinder: der hat wohl gemeint das Sleep(10) nur aktiv ist wenn das Programm minimiert ist... und nicht immer wie du vielleicht dachtest
-
Kannst du mal posten ob der Kram von Fenders jetzt funktioniert hat?
Das der Kram mit WM_ACTIVATEAPP kann das auch nicht funktionieren. Ich würde einfach WM_ACTIVATE nehmen. Und ich würde den ganzen Kram auch ein bischen anders aufbauen:
Erstmal eine globale Variable (z.B. bool acitve = true)
while(run) { if(aktive) { if(GetMessage(...)) { ... } else run = 0; } else { if(PeekMessage(...)) { ... } else ... } }
Jetzt musst du bei PeekMessage irgendwo noch run = 0 einbauen. In der Nachrichtenschleife verarbeitest du dann die Nachricht WM_ACTIVATE.
Sie wird aufgerufen wenn die Anwendung aktiviert oder deaktiviert wird.