PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm Ruhemodus?


Che
2003-06-28, 21:20:39
Wie kann ich denn mein Programm, wenn es minimiert wird, in den Ruhemodus versetzen?

Damit es keine Prozessorleistung mehr braucht, das sieht ja hässlich aus wenn die Auslastung bei 50% (und das auch nur weil ich P4 HT hab' ;)) liegt obwohl das Programm nur auf der Taskleiste liegt.

Da müsste es doch etwas geben, um den aktiven Thread einzuschläfern und bei Bedarf wieder aufzuwecken...

stabilo_boss13
2003-06-28, 21:29:55
Welche Programmiersprache?

Demirug
2003-06-28, 21:51:32
Ich nehme mal schwer an das du in deinem Programm einen modifizierten MessageLoop hast der ständig etwas rendert wenn es keine Nachrciht zu verarbeiten gibt, oder?

Che
2003-06-29, 12:32:56
ad 1: C++

ad 2: so ists :) Und wenn ich nun die minimize message empfange sollte das ganze unterbrochen, abgewürgt oder jedenfalls irgendwie lahmgelegt werden. Bei Glut gibts ja die "GlutIdleFunction" wenn ich mich recht erinnere, soas musses doch für die Win32API auch geben...

Demirug
2003-06-29, 12:40:39
WaitMessage ist dein Freund. Die Funktion blockiert den Aufrufenden Thread solange bis eine neue Nachricht vorhanden ist.

Bei der Verwendung von WaitMessage sollte man allerdings beachten das man sobald die Funktion zurückkert die Message queue kompelet ausliest.

Che
2003-06-29, 13:37:46
Irgendwie haut das nicht hin:

case WM_SYSCOMMAND:
{
if(SC_MINIMIZE == wParam)
{
WindowSystem.setState(SW_MINIMIZE);
WaitMessage();
break;

}
if(SC_RESTORE == wParam)
{
WindowSystem.setState(SW_RESTORE);
break;
}

//alles andere an Windows weitergeben
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


WaitMessage wird aufgerufen, kehrt aber sofort wieder zurück. Sind da noch messages in der Queue?
Oder mach ich am Ende etwas falsch?

Demirug
2003-06-29, 13:59:58
hehe so kann das nicht funktionieren.

case WM_SYSCOMMAND:
{
if(SC_MINIMIZE == wParam)
{
WindowSystem.setState(SW_MINIMIZE);
donotrender = true;
break;

}
if(SC_RESTORE == wParam)
{
WindowSystem.setState(SW_RESTORE);
donotrender = false;
break;
}

//alles andere an Windows weitergeben
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


und der Messageloop muss in etwa so aufgebaut werden


while (true)
{
while (PeekMessage (...))
{
if (msg == WM_QUIT)
return;

TranslateMessage (...);
DispatchMessage (...);
}

if (donotrender)
WaitMessage ();
else
RenderNextFrame ();
}

Che
2003-06-29, 16:02:48
Vorm Mittagessen noch schnell gehackt, das kann ja nicht gzutgehen.
Beim Essen fiels mir dann ein: WaitMessage INNERHALB der Winproc - was für ein Schwachsinn ?-) :bonk:

(@Mods: kann man meinen vorherigen Post entfernen, das ist ja direkt peinlich...)

Trotzdem Danke für die Hilfe