mein programm verbraucht alle cpu leistung
-
jo also wie oben im topic schon beschrieben, verbraucht mein programm im leerlauf alle cpu zeit die es kriegen kann. ist eig ein normales win32 gui prog.
ich habe keine ahnung was das verursacht, ich kann nur auf die common controls tippen, ich habe einen list und einen treeview als child windows im hauptfenster, aber wenn ich diese fenster auskommentiere, ändert sich trotzdem nichts. ich weiss aber, dass das programm vorm einfügen der common sontrols noch normal lief...
als compiler benutze ich gcc 3.2 (mingw special 20020817-1) und als ide dev-cpp 5(beta), aber ich glaube dass es nicht mit dem compiler zusammenhängt, denn das selbe problem hatte ich auch schon mal mit vc6 (und habs net hinbekommen)wenn ihr irgendeine idee habt, was es sein könnte, helft mir...
mfg fallen
-
Alles Unnütze aus deinem Code rausnehmen und dann den Code posten.
-
Bitte poste mal deine Message-Loop und WndProc.
Ist schwer was zu sagen wenn man den code net sieht..
-
Was auch sehr groß Ressourcen fressen kann (bis Windows sogar nicht mehr mit seiner GDI klarkommt) sind nichtfreigegebene Speicher! Sogenannte Specherleaks! Das heißt, Du hast vergessen, DeleteObject, DeleteFont, delete [] oder der gleichen zu benutzen! Schau mal nach, könnte sein!
-
ChrisK schrieb:
Was auch sehr groß Ressourcen fressen kann (bis Windows sogar nicht mehr mit seiner GDI klarkommt) sind nichtfreigegebene Speicher! Sogenannte Specherleaks! Das heißt, Du hast vergessen, DeleteObject, DeleteFont, delete [] oder der gleichen zu benutzen! Schau mal nach, könnte sein!
Hat aber nichts mit der CPU-Auslastung zu tun.
-
Stimmt.
-
also dass es mem leaks sind glaub ich nich, hab immer alles schon free()'d
jo mein message loop:
/* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); }
und meine wndproc:
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; case WM_SIZE: { RECT rcClient; GetClientRect(hwnd, &rcClient); MoveWindow(ExTV.GetHandle(), 0, 0, 150, rcClient.bottom, TRUE); MoveWindow(MP3LV.GetHandle(), 153, 0, rcClient.right - 153, rcClient.bottom, TRUE); break; } case WM_PAINT: UpdateWindow(ExTV.GetHandle()); UpdateWindow(MP3LV.GetHandle()); break; case WM_NOTIFY: { NMHDR* nmhdr; nmhdr = (NMHDR*)lParam; if (nmhdr->code == TVN_SELCHANGED) { char szDir[MAX_PATH]; ExTV.TVSelChanged((NMTREEVIEW*)lParam); ExTV.GetSelectedDir(szDir); MP3LV.ChangeDir(szDir); UpdateWindow(ExTV.GetHandle()); UpdateWindow(MP3LV.GetHandle()); } break; } default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
edit:
wie ihr sicher seht, habe ich treeview und listview jeweils in eine klasse gekapselt, die dann alles weitere übernimmt
-
case WM_PAINT: UpdateWindow(ExTV.GetHandle()); UpdateWindow(MP3LV.GetHandle()); break;
*hust*
BeginPaint
*hust*
EndPaint
*hust*
-
Du musst mal schauen, ob Du mit WM_PAINT richtig umgehst.
Huch, ich sollte öfters auf "Refresh" klicken. :> Sorry CMatt.
-
lalala *indieluftguck*
ähm... ja... *aufdiekniefall*
scherz beiseite danke euch ich wusste zwar dass man das machen muss wenn man was painten will, aber das man das auch da machen muss, war mir unbekannt... hmm naja der mensch lernt halt dazu
mfg fallen
-
Wenn du WM_PAINT abfängst musst du Begin-/EndPaint aufrufen um das Fenster wieder als gültig zu markieren (sonst kommt die Message immer wieder) oder du bearbeitest die Message gar nicht (wenn du eh nichts zeichnen willst) und lässt die DefWindowProc diese Arbeit übernehmen
-
jo bloß wenn ich die in dem falle nicht abfange, werden die children nicht richtig gezeichnet (bzw erst wenn ich rein klicke)
-
fallen schrieb:
jo bloß wenn ich die in dem falle nicht abfange, werden die children nicht richtig gezeichnet (bzw erst wenn ich rein klicke)
Das ist aber nicht gut. Schau nochmal in die Klassen rein. Scheint so, als würde darin WM_PAINT oder WM_ERASEBKGND abgefangen.
-
ne des wüsst ich weil die hab ich selber verzapft