Probleme mit Timer



  • Wieso bekommt mein Fenster keine WM_TIMER Nachricht?

    LRESULT CALLBACK TimeProcedure (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HWND hStart, hZeroTimer;
        static HWND edTimer1;
        static float time = 0.0f;
        static bool fTimer = false;
        static UINT Timer;
        char temp[10];
    
        switch (message)                  /* handle the messages */
        {
            case WM_CREATE:
            {
                hStart = CreateWindow ("button", "Start / Stopp", WS_CHILD | WS_VISIBLE,
                                           60, 170, 120, 50, hWnd, (HMENU) BU_STARTTIME, 
                                           ((LPCREATESTRUCT) lParam) ->hInstance, NULL);
    
                hZeroTimer = CreateWindow ("button", "Nullstellung", WS_CHILD | WS_VISIBLE,
                                           215, 170, 120, 50, hWnd, (HMENU) BU_ZEROTIME, 
                                           ((LPCREATESTRUCT) lParam) ->hInstance, NULL);
    
                edTimer1 = CreateWindow ("edit", "", WS_CHILD | WS_VISIBLE | ES_RIGHT,
                                           60, 30, 120, 50, hWnd, NULL, 
                                           ((LPCREATESTRUCT) lParam) ->hInstance, NULL);
    
                break;
            }
            case WM_COMMAND:
            {
                switch (LOWORD(wParam))
                {
                    case BU_ZEROTIME:
                    {
                        break;
                    }
                    case BU_STARTTIME:
                    {
                        if (fTimer)
                        {
                            KillTimer (hWnd, Timer);
                            time = 0.0f;
                            fTimer = false;
                            SendMessage (hWnd, WM_TIMER, 0, 0);
                        }
                        else
                        {
                            SetTimer (hWnd, 1, 100, NULL);
                            fTimer = true;
                        }
                        break;
                    }
                    default:
                        break;
                }
                break;
            }
            case WM_TIMER:
            {
                time += 0.1f;
                sprintf (temp, "%.2f", time);
                SetWindowText (edTimer1, temp);
                UpdateWindow (edTimer1);
                break;
            }
            case WM_DESTROY:
                PostQuitMessage (0);       
                break;
            default:                      
                return DefWindowProc (hWnd, message, wParam, lParam);
        }
        return 0;
    }
    

    Hab schon viel rumprobiert, bin aber auf keine Lösung gestoßen.



  • - Was hier stand hat hoffentlich niemand gelesen -



  • Schon mal GetLastError nach SetTimer aufgreufen?



  • Ja, Ergebnis: ERROR_ACCESS_DENIED
    Kann ich mir nix drunter vorstellen.





  • GetLastError() aber nur Aufrufen, wenn SetTimer fehlgeschlagen ist.



  • ist fehlgeschlagen! Es wird 0 zurückgegeben.



  • Und wenn du eine andere ID als 1 nimmst?



  • Nein. Kanns daran liegen, dass das Fenster selbst ein Child ist?

    WNDCLASSEX wincl;
    
                wincl.hInstance = ((LPCREATESTRUCT) lParam) ->hInstance;
                wincl.lpszClassName = szTimeName;
                wincl.lpfnWndProc = TimeProcedure;
                wincl.style = CS_DBLCLKS;
                wincl.cbSize = sizeof (WNDCLASSEX);
    
                wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
                wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
                wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
                wincl.lpszMenuName = NULL;
                wincl.cbClsExtra = 0;
                wincl.cbWndExtra = 0;
                wincl.hbrBackground = CreateSolidBrush (RGB (128, 128, 128));
    
                RegisterClassEx (&wincl);
    
                lTime = CreateWindow (szTimeName, "", WS_CHILD, 
                                       400, 305, 390, 235, hWnd, NULL, 
                                       ((LPCREATESTRUCT) lParam) ->hInstance, NULL);
    


  • Kannst du nicht den ganzen Quelltext geben so das wir es kompilieren können?



  • --- Aufgrund des Posts weiter unten gelöscht ---



  • Normalerweise postet man ein Minimalbeispiel das den Fehler zeigt.

    Und das tolle daran ist, das man den Fehler dann auch meistens selbst findet, wenn man den Code so weit eingrenzen kann. Nimm ALLES raus was nichts mit dem Fehler zu tun hat.



  • hmm, Prob gelöst: das Programm musste das DefWndProc für WM_PAINT aufrufen.
    Darauf muss man erst mal kommen. Danke an alle für die Hilfe.



  • Ok, das wars doch nicht. Jedenfalls nicht ganz. Anscheinend ergibt sich ein ähnliches Problem, wenn mehr als ein Child im Haupfenster angezeigt werden. Und zwar wird das Edit dann trotz wiederholter Anwendung von UpdateWindow nicht aktualisiert. Soll ich Code posten? Wird etwas umfangreich, da man nicht mehr viel entfernen kann.



  • Wenn du es nicht schaffst das Problem / Programm zu minimalisieren, weil dann evtl. der Fehler gar nicht mehr auftritt, dann solltest versuchen Stück für Stück deinen Code wieder reinzunehmen, um zu testen, was dieses Verhalten verursacht. Wenn alles nichts mehr hilft, kannst du ja einen so stark wie dir möglich vereinfachten Code posten (dürfte dann ja eigentlich auch nicht allzu schrecklich lang sein) 😉


Anmelden zum Antworten