Timer problem



  • Hi.

    Ich versuch grad ein problem zu versthen, aber dazu fehlt mir wohl die kenntniss ueber windows selbst.

    Also: ich wndproc in dem ich mir einen Timer mach ca so:

    WndProc(hwnd,msg,lp,wp) ~
    {
    ....
    case WM_CREATE: SetTimer(hwnd,1,3000,0); break;
    case WM_TIMER: DoSomething(); break;
    }
    

    Das funktioniert auch soweit ganz gut, is ja simpel.

    So, ich wenn ich jetzt aber das mache gehts nicht mehr:

    WndProc(hwnd,msg,lp,wp) ~
    {
    ....
    case WM_CREATE: SetTimer(hwnd,1,3000,0); return 0;
    case WM_TIMER: DoSomething(); return 0;
    case WM_PAINT:
         {
          BeginPaint (Hwnd, &ps);
    	EndPaint (Hwnd, &ps) ;
         RenderOglFrame();
         SwapBuffers (hDC);
         InvalidateRect(hwnd,0,true);
         return 0;
         }
    }
    

    entferne ich das InvalidateRect(hwnd,0,true); gehts, das will ich aber, den so produzier ein konstanten neuzeichnens.

    Was ich jetzt ueberhaupt nicht versteht ist warum es dann keine WM_TIMER mehr durchkommt (?? nicht gesendet/ nicht empfangen .. ka) alle andern msg's (so weit ich sie benutzte) arbeiten immer noch gut, wie WM_MOUSE... oder WM_KEYDOWN ...!
    Nur die WM_TIMER is nich mehr????

    Und das macht fuer mich keinen Sinn, warum? Und was kann man da tun?

    Vielen Dank
    Flo



  • Grob gesagt: Timernachrichten werden nur bearbeitet, wenn sonst grad nichts zu tun ist. Du sorgst dafür, dass immer was zu tun ist...



  • Timer noch am ende Killen.



  • genau. die WM_PAINT message hat höchste priorität. da du bei der bearbeitung von WM_PAINT InvalidateRect() aufrufst, werden *ununterbrochen* nur WM_PAINT messages verarbeitet. an deiner stelle würde ich einen timer verwenden, um das neuzeichen des fensterinhalts zu steuern. zB

    enum // timer-events
    {
      ...
      timer_redraw_window,
      ...
    };
    
    case WM_CREATE:
      ...
      SetTimer(hwnd,timer_redraw_window,100,0); // redraw-event auf 10 mal pro sekunde einstellen
      ...
      return 0;
    
    case WM_TIMER:
      ...
      if(wparam==timer_redraw_window) // redraw event
        InvalidateRect(hwnd,0,TRUE);
      ...
      return 0;
    


  • mmh

    Das Invalidate hatte ich vorher mal in dem timer drin, aber irgendwie scheinen die timer nicht so ganz genau zu laufen, wenn die zeit < 50 ms, zusmindest scheint das nicht zu konstant zu sein.

    Mir is klar das ich so immer eine WM_PAINT in der warte schleife habe. Ich wuerde gerne verstehen warum alle andren msg's wie WM_MOUSE..., oder KEYDOWN oder so weiterhin funktionieren, aber die WM_TIMER nicht mehr. Wo ist der unterschied?



  • der Timer ist da zu da, um in Ruhepausen denoch Code auszuführen etc., läuft aber eine Schleife oder ständige Abarbeitung, ist der Timer überflüssig, da man dan im code selbst zeit messen kann und Code entsprechend ausführen kann, denn der Timer ist ungenauer als deine Handy Uhr. Im Klartext, alles ist Dominater als der Timer, möchstest du aber fast pararell Code zum bestimmten Zeit ausführen, mußt du einen weiteren Thread erzeugen.

    Sinnvolle Anwendung des Timers: Timer wird gestartet, auslösung in 5min., anwender macht was-> Timer neu starten, anwender macht 5min. lang nichts, ICQ schaltet auf Idle des Users.

    Nicht Sinnvoll: Timer soll alle 40ms ein Bild aus einem Video laden und Anzeigen, ich lache immer wieder über diese Vorstellung 😃


Anmelden zum Antworten