Problem mit Timer
-
Hallo Leute, ich habe folgendes Programm geschrieben.
Doch leider gibt es ein Problem mit dem Timer.
Immer wenn mann die Maus oder das Fenster bewegt stock die Uhrzeit.
Und nach einer Minute macht das Programm totale Probleme.
Beim ausführen des Programms seht ihr ja was schief läuft.
Hier der Code:// neu06.cpp : Definiert den Einsprungpunkt für die Anwendung. // Buch Seite 86-93 //Rot=236 Grün=233 Blau=216 (standart Hellgrau) #include "stdafx.h" #include <windows.h> #include <winbase.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstGlobal; const UINT TimerSec = 1; HWND hButtonRadioButton, hButtonRadioButton2, hButtonRadioButton3, hButtonRadioButton4, hButtonCheckBox; SYSTEMTIME st; //time SYSTEMTIME systime; //time-variable char szBuffer[30] = { 0 }; //time-variable int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { hInstGlobal = hInstance; WNDCLASS WndClass; WndClass.style = 0; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.lpfnWndProc = WndProc; WndClass.hInstance = hInstance; WndClass.hbrBackground = (HBRUSH)(COLOR_MENU+12); //+7 ist mitteleres Grau //+9 ist dunkles Grau //+12 ist helles Grau WndClass.hCursor = LoadCursor (NULL, IDC_ARROW); WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION); WndClass.lpszMenuName = 0; WndClass.lpszClassName = "WinProg"; //GetSystemTime(&st); //time //DWORD hours = st.wHour; //time //DWORD minutes = st.wMinute; //time //DWORD seconds = st.wSecond; //time RegisterClass(&WndClass); int x,y; x = GetSystemMetrics (SM_CXSCREEN); y = GetSystemMetrics (SM_CYSCREEN); HWND hWindow; hWindow = CreateWindow("WinProg","Shutdown", WS_OVERLAPPED, (x/2)-200,(y/2)-150, 800,300,NULL,NULL, hInstance, NULL); ShowWindow (hWindow, nCmdShow); UpdateWindow (hWindow); MSG Message; while (GetMessage(&Message, NULL, 0, 0)) { TranslateMessage (&Message); DispatchMessage(&Message); } return (Message.wParam); } LRESULT CALLBACK WndProc (HWND hWnd, UINT uiMessage, WPARAM wParam,LPARAM lParam) { static RECT rect; static BOOL isActive; const UINT left = 520; const UINT top = 200; const UINT right = left+84; const UINT bottom = top+16; // static int SetTimer(hWnd, TimerSec, 100, NULL); //TIMER isActive = true; switch(uiMessage) { case WM_PAINT: HPEN hPen; HPEN hPenalt; HBRUSH hBrush; HBRUSH hBrushalt; hBrush = CreateSolidBrush (RGB(255,100,0)); hPen = CreatePen (PS_SOLID,3,RGB(0,0,255)); HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint (hWnd, &ps); //BEGIN PAINT hBrushalt = (HBRUSH) SelectObject (hdc, hBrush); hPenalt = (HPEN) SelectObject (hdc, hPen); MoveToEx (hdc, 500, 50, NULL); //Position des Cursors hPen = CreatePen (PS_SOLID,3,RGB(255,0,0)); //neue Farbe hPenalt = (HPEN) SelectObject (hdc, hPen); LineTo (hdc, 600, 100); //Zeichnet von Cursorposition zu gegebenen Koordinaten eine Linie //BOOL Rectangle( HDC hdc, int nLeftRect, int nTopRect,int nRightRect, int nBottomRect); hPen = CreatePen (PS_SOLID,3,RGB(0,0,255)); //neue Farbe hPenalt = (HPEN) SelectObject (hdc, hPen); Rectangle (hdc, 400,100,500,200); //Rectangle (hdc, left, top, right, bottom); //Bereich des Zeitausgabefenster //RoundRect (hdc, 260, 20, 20, 40, 20, 20); //SelectObject (hdc, hBrushalt); //SelectObject (hdc, hPenalt); HFONT hFont; //textout begin hFont = (HFONT) GetStockObject ( SYSTEM_FONT); // //SelectObject (hdc, hFont); // SetTextColor (hdc, RGB(0,0,180)); // SetBkColor (hdc, RGB(190,180,200)); // //SetTextAlign (hdc, TA_LEFT); // char *string1; // string1 = new char[12]; // lstrcpy (string1,"SYSTEM_FONT"); //belegt string1 mit Text TextOut (hdc, 100, 100, string1, lstrlen(string1)); //textout end GetLocalTime( &systime ); //GetSystemTime(&systime); wsprintf( szBuffer , "%02d:%02d:%02d:%03d",systime.wHour,systime.wMinute,systime.wSecond,systime.wMilliseconds); string1 = szBuffer; SetTextColor (hdc, RGB(0,0,180)); SetBkColor (hdc, RGB(190,180,200)); TextOut (hdc, left, top, string1, lstrlen(string1)); // TextOut (hdc, 100, 100, seconds, lstrlen(seconds)); EndPaint (hWnd, &ps); return 0; case WM_SIZE: { rect.left = left; //x-links rect.top = top; //y-oben rect.right = right; //x-rechts rect.bottom = bottom; //y-unten return 0; } case WM_TIMER: { InvalidateRect(hWnd, &rect, TRUE); // bewirkt die Aktuallisierung return 0; } case WM_CREATE: HWND hButtonShutdown, hButtonExit, hButtonGroupBox, hButtonGroupBox2; hButtonShutdown = CreateWindow("BUTTON","Shutdown", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10,240,80,20, hWnd,(HMENU) 1, hInstGlobal, NULL); hButtonExit = CreateWindow("BUTTON","Exit", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 100,240,80,20, hWnd,(HMENU) 2, hInstGlobal, NULL); hButtonGroupBox = CreateWindow("BUTTON","Aktion", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 5,5,380,120, hWnd,(HMENU) 3, hInstGlobal, NULL); hButtonRadioButton = CreateWindow("BUTTON","Herunterfahren", WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON, 10,20,280,20, hWnd,(HMENU) 4, hInstGlobal, NULL); hButtonRadioButton2 = CreateWindow("BUTTON","Neustart", WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON, 10,40,280,20, hWnd,(HMENU) 5, hInstGlobal, NULL); hButtonRadioButton3 = CreateWindow( "BUTTON","Herunterfahren und Ausschalten", WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON, 10,60,280,20, hWnd,(HMENU) 6, hInstGlobal, NULL); hButtonRadioButton4 = CreateWindow("BUTTON","Abmelden", WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON, 10,80,280,20, hWnd,(HMENU) 7, hInstGlobal, NULL); hButtonGroupBox2 = CreateWindow("BUTTON","Option", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 5,140,350,80, hWnd,(HMENU) 8, hInstGlobal, NULL); hButtonCheckBox = CreateWindow( "BUTTON", "keine Nachricht an laufende Anwendungen", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 10,160,340,20, hWnd,(HMENU) 9, hInstGlobal, NULL); return 0; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { if (LOWORD(wParam) == 1) { int Parameter; Parameter = 0; if (SendMessage (hButtonRadioButton, BM_GETCHECK, 0, 0) == BST_CHECKED) { Parameter = EWX_SHUTDOWN; } if (SendMessage (hButtonRadioButton2, BM_GETCHECK, 0, 0) == BST_CHECKED) { Parameter = EWX_REBOOT; } if (SendMessage (hButtonRadioButton3, BM_GETCHECK, 0, 0) == BST_CHECKED) { Parameter = EWX_POWEROFF; } if (SendMessage (hButtonRadioButton4, BM_GETCHECK, 0, 0) == BST_CHECKED) { Parameter = EWX_LOGOFF; } if (SendMessage (hButtonCheckBox, BM_GETCHECK, 0, 0) == BST_CHECKED) { Parameter = Parameter | EWX_FORCE; } ExitWindowsEx (Parameter, 0); } if (LOWORD(wParam) == 2) { SendMessage (GetParent((HWND)lParam), WM_DESTROY ,0 ,0); } if (LOWORD(wParam) == 4) { if (!(SendMessage ((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)) { SendMessage ((HWND)lParam, BM_SETCHECK, BST_CHECKED, 0); SendMessage (hButtonRadioButton2, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage (hButtonRadioButton3, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage (hButtonRadioButton4, BM_SETCHECK, BST_UNCHECKED, 0); } } if (LOWORD(wParam) == 6) { if (!(SendMessage ((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)) { SendMessage ((HWND)lParam, BM_SETCHECK, BST_CHECKED, 0); SendMessage (hButtonRadioButton, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage (hButtonRadioButton2, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage (hButtonRadioButton4, BM_SETCHECK, BST_UNCHECKED, 0); } } if (LOWORD(wParam) == 7) { if (!(SendMessage ((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)) { SendMessage ((HWND)lParam, BM_SETCHECK, BST_CHECKED, 0); SendMessage (hButtonRadioButton, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage (hButtonRadioButton3, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage (hButtonRadioButton2, BM_SETCHECK, BST_UNCHECKED, 0); } } if (LOWORD(wParam) == 5) { if (!(SendMessage ((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)) { SendMessage ((HWND)lParam, BM_SETCHECK, BST_CHECKED, 0); SendMessage (hButtonRadioButton, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage (hButtonRadioButton3, BM_SETCHECK, BST_UNCHECKED, 0); SendMessage (hButtonRadioButton4, BM_SETCHECK, BST_UNCHECKED, 0); } } if (LOWORD(wParam) == 9) { if (SendMessage ((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED) { SendMessage ((HWND)lParam, BM_SETCHECK, BST_UNCHECKED, 0); } else { SendMessage ((HWND)lParam, BM_SETCHECK, BST_CHECKED, 0); } } } return 0; case WM_DESTROY: if (isActive) { KillTimer(hWnd, TimerSec); } PostQuitMessage(0); return 0; default: return DefWindowProc (hWnd, uiMessage, wParam, lParam); } }Also ich bin für jeden Rat sehr dankbar.
rom4o
-
rom4o schrieb:
Also ich bin für jeden Rat sehr dankbar.
Benutz bitte C++-Tags anstatt Code-Tags. Es liest sich so sehr mühsam, zumal es sehr viel Code ist.
Ich hab mir den Source noch nicht genauer angesehen.. aber du sagst nach ner Minute kackt das Programm völlig ab?
Dann könnte irgendwo ein Speicher/Array/wasweißich überlaufen. Schließt du auch alles wieder schön, was du geöffnet hast?
-
rom4o schrieb:
Doch leider gibt es ein Problem mit dem Timer.
Immer wenn mann die Maus oder das Fenster bewegt stock die Uhrzeit.Setz mal den Aufruf von SetTimer in die "WinMain" gleich nach CreateWindow und nicht in die "WndProc".
Es reicht wenn SetTimer nur einmal aufgerufen wird.
-
wie wärs mal mit DeleteObject?
-
**
Hallo Leute erstmal sorry für das späte Feedback,
bin zur Zeit auf Zypern und hab hier nur sehr selten Internet :-D.Jetzt hab ich endlich Zeit gefunden mich wieder mit dem Problem zu beschäftigen.
@Machine, okey das mit den C++-Tags werde ich das nächste mal beachten...danke
@zeitloser, ich habe deinen Rat befolgt und siehe da, es läuft dann sehr gut.
@schaafrichter, was meinst du mit DeleteObject genau?
Muss ich irgendwo zyklisch ein erstelltes Object wieder löschen??
Wenn ja wo?Ich habe das Programm mal abgespeckt und alle Buttons bis auf Exit herausgenommen.
So wollte ich das Problem finden. Habe aber keinen Erfolg gehabt.Das Programm welches anfangs wunderbar läuft, stürzt nach ca. 1Minute ab.
Und wenn ich parallel den Windows Task-Manager laufen lasse, sehe ich, dass
die Speicherauslastung für das Programm stätig ansteigt.Also wie Machine schon vermutet hat muss irgendwo was überlaufen.
Nur ich finde nichts.Dann habe ich mal die SetTimer-Anweisung in Zeile 50 herausgenommen,
dann läuft der Speicher nur noch voll wenn ich das Fenster oder die Maus bewege.Hier ist jetzt nochmal der aktuelle Code:
**#include "stdafx.h" #include <windows.h> #include <winbase.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstGlobal; const UINT TimerSec = 1; SYSTEMTIME systime; //time-variable char szBuffer[30] = { 0 }; //time-variable HWND hWindow; //Hauptfenster, für TIMER2 hier deklariert int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { hInstGlobal = hInstance; WNDCLASS WndClass; WndClass.style = 0; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.lpfnWndProc = WndProc; WndClass.hInstance = hInstance; WndClass.hbrBackground = (HBRUSH)(COLOR_MENU+12); //+7 ist mitteleres Grau //+9 ist dunkles Grau //+12 ist helles Grau WndClass.hCursor = LoadCursor (NULL, IDC_ARROW); WndClass.hIcon = LoadIcon (NULL, IDI_APPLICATION); WndClass.lpszMenuName = 0; WndClass.lpszClassName = "WinProg"; RegisterClass(&WndClass); int x,y; x = GetSystemMetrics (SM_CXSCREEN); y = GetSystemMetrics (SM_CYSCREEN); // HWND hWindow; // wird schon vor der WinMain-Methode deklariert hWindow = CreateWindow("WinProg","CountShutdown", WS_OVERLAPPED, (x/2)-200,(y/2)-150, 800,300,NULL,NULL, hInstance, NULL); ShowWindow (hWindow, nCmdShow); UpdateWindow (hWindow); MSG Message; SetTimer(hWindow, TimerSec, 1, NULL); //TIMER2 neue Variante while (GetMessage(&Message, NULL, 0, 0)) { TranslateMessage (&Message); DispatchMessage(&Message); } return (Message.wParam); } LRESULT CALLBACK WndProc (HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam) { static RECT rect; static BOOL isActive; const UINT left = 520; const UINT top = 200; const UINT right = left+84; const UINT bottom = top+16; // static int static char *string1; string1 = new char[]; // SetTimer(hWnd, TimerSec, 100, NULL); //TIMER1 alte Variante isActive = true; // wenn true, dann ist der Timer initialisiert switch(uiMessage) { case WM_PAINT: HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint (hWnd, &ps); //BEGIN PAINT GetLocalTime( &systime ); //GetSystemTime(&systime); wsprintf( szBuffer , "%02d:%02d:%02d:%03d",systime.wHour,systime.wMinute,systime.wSecond,systime.wMilliseconds); string1 = szBuffer; SetTextColor (hdc, RGB(0,0,180)); SetBkColor (hdc, RGB(236,233,216)); //Rot=236 Grün=233 Blau=216 (standart Hellgrau) TextOut (hdc, left, top, string1, lstrlen(string1)); EndPaint (hWnd, &ps); //END PAINT return 0; case WM_SIZE: { rect.left = left; //x-links rect.top = top; //y-oben rect.right = right; //x-rechts rect.bottom = bottom; //y-unten return 0; } case WM_TIMER: { InvalidateRect(hWnd, &rect, TRUE); // bewirkt die Aktuallisierung im Bereich von rect return 0; } case WM_CREATE: HWND hButtonExit; hButtonExit = CreateWindow("BUTTON","Exit", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 100,240,80,20, hWnd,(HMENU) 2, hInstGlobal, NULL); return 0; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { if (LOWORD(wParam) == 2) { SendMessage (GetParent((HWND)lParam), WM_DESTROY ,0 ,0); } } return 0; case WM_DESTROY: if (isActive) { //KillTimer(hWnd, TimerSec); //TIMER1 alte Variante KillTimer(hWindow, TimerSec); //TIMER2 neue Variante } PostQuitMessage(0); return 0; default: return DefWindowProc (hWnd, uiMessage, wParam, lParam); } }**
Also weierhin vielen Dank für eure Hilfe und die bisherigen Ratschläge.rom4o**
-
zeile 70...
rom40 schrieb:
static char *string1; string1 = new char[];ähm ja, es wundert mich, das das kompiliert, aber das leckt.
string1 = szBuffer;ist auch sinnlos, du überschreibst ja den angeforderten speicher.
mach doch einfach zu beginn ein
char szBuffer[64]
ob static oder nicht ist egalbtw wofür DeleteObject? ich sehe da kein zu löschendes objekt?
-
dann guck dir mal den code an, auf den sich der kommentar bezog du schmalspuragent, dann siehste gleich dutzende
