100 Prozent Prozessorlast
-
Hi Folks.
Ich habe ein kleines Windowsprogramm mit Visual C++ geschrieben. Eine Windowsklasse, message handler und einen event loop. Wenn ich das Programm starte, hat mein Prozessor eine Auslastung von 100 Prozent. Wie kann ich dieses Problem umgehen? Ohne den event loop beendet sich das Program ja sofort nach dem Start. Oder gibts da noch was anderes?
Thx
-
Ein einfaches Sleep(0) in der Schleife sollte reichen.
-
Das liegt wohl daran, dass du in deiner Message-Loop PeekMessage statt GetMessage aufrufst. Falls nicht musst du mal ein wenig Code zeigen
-
Also das hilft beides nicht. Aber ich poste den loop mal:
while (TRUE) { if (GetMessage(&msg, hwnd, 0, 0)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } if(KEYDOWN(VK_ESCAPE)) PostMessage(hwnd, WM_DESTROY, 0, 0); }
-
Willst du ein Spiel machen, oder warum hast du eine so seltsame (ist es für ein Spiel zwar immernoch) Main-Loop? So sieht die normalerweise aus:
while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam;
Und das mit KEYDOWN(VK_ESCAPE)) macht man normalerweise mit WM_KEYDOWN in der WindowProc des Hauptfensters und DestroyWindow
Siehe auch: Gerüst für ein standard Windows-Programm
-
Ich hab das jetzt mal so gemacht. Aber die Prozessorauslastung ist immer noch bei 100 Prozent und dieses Sleep(0); hilft auch nicht.
-
Kann eigentlich fast nicht sein - zeig mal den ganzen Code (dürfte ja dann wohl noch nicht allzu viel sein)
-
Ok, hab eben schon gesucht wie ein Verrückter, aber nicht gefunden worans liegt.
Hier ist mal der gesamte Code:// defines #define WIN32_LEAN_AND_MEAN #define WINDOW_CLASS_NAME "WINCLASS1" #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) // includes #include <windows.h> //#include <windowsx.h> // globals //################# Functions #################\\*/ LRESULT CALLBACK WindowProc (HWND, UINT, WPARAM, LPARAM); // WinMain int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int iCmdShow) { WNDCLASSEX winclass; // holds the window class HWND hwnd; // generic window handle MSG msg; // generic message // fill in fields of the window class winclass.cbSize = sizeof(WNDCLASSEX); // Save size of class winclass.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC | CS_DBLCLKS; // Redraw, Own Device Context, Send doubleclick message winclass.lpfnWndProc = WindowProc; // Callback - Function winclass.cbClsExtra = 0; // No extra information winclass.cbWndExtra = 0; // No extra information winclass.hInstance = hinstance; // assign the app instance winclass.hIcon = LoadIcon(hinstance, IDI_APPLICATION); // Load the icon of the window winclass.hCursor = LoadCursor(hinstance, IDC_ARROW); // Load the Cursor of the window winclass.hbrBackground = HBRUSH(GetStockObject(BLACK_BRUSH)); // Color for the Background winclass.lpszMenuName = NULL; // Name of the menu to attach winclass.lpszClassName = WINDOW_CLASS_NAME; // Name of the class itself winclass.hIconSm = LoadIcon(hinstance, IDI_APPLICATION); // Load the small icon of the window // Register window class if (!RegisterClassEx(&winclass)) return(0); // creates the window if(!(hwnd = CreateWindowEx (NULL, // extended style WINDOW_CLASS_NAME, // class "Muh", //title WS_OVERLAPPEDWINDOW | WS_VISIBLE, 300,200, // position 400,400, // size NULL, // handle to parent LoadMenu(hinstance, NULL), // handle to menu hinstance, // handle of this app NULL))) // extra creation parms return(0); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); // enter main event loop while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } // return to windows return(msg.wParam); } // end WinMain // WinProc , main message handler LRESULT CALLBACK WindowProc(HWND hwnd, // window handle of sender UINT msg, // message id WPARAM wparam, // further defines messages LPARAM lparam) // further defines messages { // which message switch(msg) { case WM_CREATE: { // do initialization here return(0); } break; case WM_PAINT: { // begin painting return(0); } break; case WM_DESTROY: { // kills the app, this sends a WM_Quit message PostQuitMessage(0); return(0); } break; case WM_ACTIVATE: { if(LOWORD(wparam) != WA_INACTIVE) { // window is activated, do work } else { // window is deactivated, do work } } break; case WM_CLOSE: { // the window is being closed, do work return(0); } break; case WM_KEYDOWN: { if(KEYDOWN(VK_ESCAPE)) PostMessage(hwnd, WM_DESTROY, 0, 0); return(0); } break; default: break; } // end switch // default message handler (important!!!), process all other messages return(DefWindowProc(hwnd, msg, wparam, lparam)); } // end WinProc
edit by flenders: Bitte Code-Tags verwenden!
-
In WM_PAINT nie! nur ein return 0; schreiben. Entweder gar nicht abfangen oder zumindest Begin- und EndPaint aufrufen
-
In habe gerde in der MSDN-Library noch etwas interessantes / wichtiges gelesen
Because the return value can be nonzero, zero, or -1, avoid code like this:
while (GetMessage( lpMsg, hWnd, 0, 0)) ...
The possibility of a -1 return value means that such code can lead to fatal application errors. Instead, use code like this:
BOOL bRet; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } }
-
und in WM_CREATE und WM_CLOSE hat ein einsames return 0; auch nix verloren...
-
case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE: DestroyWindow(hwnd); break; default: break; }
-
RPD schrieb:
und in WM_CREATE und WM_CLOSE hat ein einsames return 0; auch nix verloren...
Macht zwar nicht viel Sinn, schadet imho aber auch nicht
Nur wenn du auf WM_CLOSE mit return 0; antwortest lässt sich das Fenster imho nicht mehr normal (X bzw. Alt+F4 oder Systemmenü) schließen
-
schaden ist relativ
return 0; hat imho außer in WM_PAINT und verwandten messages garnix verloren...
-
RPD schrieb:
return 0; hat imho außer in WM_PAINT und verwandten messages garnix verloren...
If an application processes this message, it should return zero [...]
Wieso steht das dann in der MSDN-Library bei (fast) allen Messages?
-
die haben einfach keine ahnung von switch-case-break
ernst:
ich weis auch das das in der msdn so steht aber warum?
sie sind sich ja selber net sicher obs sein muß siehe 'should'
-
Wenn du kein return 0 machst wird halt anschließend noch DefWindowProc aufgerufen (macht wohl meist wenig Sinn, wenn du die Nachricht schon bearbeitet hast)
-
flenders schrieb:
Macht zwar nicht viel Sinn, schadet imho aber auch nicht
ich glaub wir sind uns einig
-
das freut mich aber
-