Win32-Anwendung

the edge

Grünschnabel
Hallo,

ich besitze ein Problem mit meiner Win32-Anwendung... :confused:
Wenn das window minimiert ist, schnallt die CPU-Auslastung auf 100% hoch.
Gibt es dafür ein Flag bei der window-Erstellung, die das Unterbindet

Mfg

the edge
 
Hallo,

hier ist der Code für das erstellen des Fensters.
Das ganze stellt eine DirectX-Anwendung dar...muss man deswegen etwas spezielles beachten?

Code:
// Das Fensterhandle
HINSTANCE hInst;

// Windows main-Funktion WINAPI
int APIENTRY WinMain(HINSTANCE hInstance,      // Handle der Programminstanz
                   HINSTANCE hPrevInstance,  // Handle der letzten Instanz
                   LPSTR lpCmdLine,          // Kommandozeile
                   int nCmdShow)             // Art wie das Fenster angezeigt werden soll
{                   
    
	// Fenster erzeugen und Handle speichern
    HWND hWnd = CreateMainWindow(hInstance);

	// Wenn der Rückgabewert 0 ist, ist ein Fehler aufgetreten
    if(0 == hWnd)
    {
        MessageBox(0,"Fenster konnte nicht erzeugt werden","Fehler",MB_OK);
        return -1;
    }
	
	//Container initialisieren
	if(FAILED(Container.Init(hWnd,hInstance)))
	{
		return -1;
	}
	
	// Struktur, in der Informationen zur Nachricht gespeichert werden
    MSG msg = { 0 };

    // Diese Schleife läuft bis WM_QUIT gesendet wird
    // Wenn eine Nachricht vorliegt, wird sie behandelt
    while(msg.message != WM_QUIT)
	{
        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        		
			// Rendern
           	Container.Control(bWindow, bAktive);
			Container.Render(bAktive);
		
				
    }

    // Rückgabewert an Windows
    //return 0;
	return msg.wParam;
}

// Fenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance)
{
    WNDCLASSEX wndClass = 
    { 
        sizeof(WNDCLASSEX),                                 // Größe angeben
        CS_DBLCLKS | CS_OWNDC |CS_HREDRAW | CS_VREDRAW,     // Standardstile        
        MessageHandler,                                     // Callback-Funktion
        0,                                                  // Zusätzliche Angaben
        0,                                                  // nicht benötigt
        hInstance,                                          // Anwendungsinstanz
        LoadIcon(hInstance, (LPCSTR)IDI_ICON1),             // Logo
        LoadCursor(NULL, IDC_ARROW),                        // Normaler Cursor
        (HBRUSH)GetStockObject(WHITE_BRUSH),                // Weißer Pinsel
        (LPCSTR)IDR_MENU1,                                  // Menü
        "WindowClass",                                      // Der Name der Klasse
        LoadIcon(hInstance, (LPCSTR)IDI_ICON1)              // Logo
    };

    // Klasse registrieren
    RegisterClassEx(&wndClass);

	
    return CreateWindowEx(NULL,                   // Keine erweiterten Stile nutzen
                          "WindowClass",          // Klassenname
                          "ObjectContainer",      // Fenstertitel
                          WS_OVERLAPPEDWINDOW |   // Fenster
                          WS_VISIBLE ,            // Eigenschaften
                          0, 0,                   // Anfangsposition 
                          800, 600,               // und Größe des Fensters
                          NULL,                   // Handle des Elternfensters
                          NULL,                   // Handle des Menüs
                          hInstance,              // Anwendungsinstanz
                          NULL);                  // wird nicht benötigt
}

Editiert von Matthias Reitinger: In Zukunft bitte selbst Code-Tags setzen, danke!
 
Die while-Schleife ab Zeile 32 des Ausschnitts läuft ungebremst weiter, auch wenn das Fenster minimiert ist – dadurch schnellt die CPU-Auslastung hoch. Du könntest ein Flag definieren, das angibt, ob die Applikation minimiert ist oder nicht (vielleicht übernimmt diese Aufgabe ja schon bAktive?). Anhand dieses Flags lässt du dein Programm dann in der Schleife gegebenenfalls pausieren, wenn das Fenster minimiert ist:
Code:
if (bMinimized) {
    Sleep(500);
}
 
Du könntest noch eine sog. "Framebremse" einbauen indem du die Zeit am Anfang und am Ende der Schleife misst und die Differenz ausrechnest, dann einen bestimmte Ziet wartest.
In der Regel sollte dein Programm nicht schneller als 30-50 Frames pro Sekunde (Schleifendurchläufe) sein.

Gruß Daniel
 
Zurück