individueller Timer



  • Hallo,

    ich brauche soetwas, wie eine SetTimerEx Funktion, bei der ich die Nachricht selbst bestimmen kann, die gesendet werden soll und der ich noch ein LONG werd als Parameter mitgebe, den die Nachricht dann in wParam oder lParam hat (this Zeiger übergeben).

    Das ich die Nachricht nicht selbst festlegen kann, lässt sich ja noch etwas verschmerzen, aber dass ich keinen LONG Wert übergeben kann, macht die SetTimer Funktion für mich unbrauchbar. Ich hab versucht den Funktionszeiger der TIMERPROC dafür zu missbrauchen, scheint aber nicht zu funktionieren (Exception). Ich dachte nämlich, dass die TIMERPROC in der DefWndProc aufgerufen wird und wenn diese die TIMER Nachricht gar nicht erreicht, dass es dann keine Probleme gibt...
    Aber da ist wohl ein Denkfehler drin, denn das funktioniert ja auch ohne Nachrichtenschleife.

    Hat jemand eine Idee?



  • Du kannst (ganz krass) den this Zeiger in der Timer-ID übergeben (bitte nicht schlagen ;)); falls du aber eine saubere Lösung willst, kannst du die erhaltene TimerID beim zugehörigen Objekt speichern, und dann in einer Schleife in WM_TIMER durch deine Objektliste gehen, und das zugehörige Objekt suchen. Anschließend dann einfach eine Timerfunktion deiner Klasse aufrufen. Das wäre eine Lösung, wenn ich dich richtig verstanden habe.

    HTH



  • Ne, den this Zeiger als TimerID übergeben funktioniert nicht, da es ja auch passieren kann, dass mal ein anderer Teil des Programms den Timer benutzt und dann würde es krachen (weil z.B. der TimerID Wert von 1 als Zeiger interpretiert wird ).

    Jo, die zweite Lösung hatte ich mir auch schon gedacht. Jedoch ist das etwas umständlich. Und ich habe immer noch das Problem, dass die TimerID aus versehen im Programm doppelt vergeben werden könnte (da ich eine Lib schreibe, das Programm schreibt jemand anders). Deswegen wäre eine eigene Nachricht wünschenswert. Aber zur Not mache ich das eben so.

    Gibts da nicht irgendwelche schönen (meinetwegen undokumentierten) Timer Funktionen?

    Danke!



  • Dass die erste Lösung nicht so praktikabel ist war mir eigentlich schon klar :D, allerdings kenn ich keine Alternative zur zweiten Lösung, du mußt halt deine zu vergende TimerID irgendwo speichern (statisch?), damit da keine doppelten vorkommen können.



  • Bastell dir doch einfach in deiner LIB eine Funktion, die die gewünschten Parameter hat und dann das ganze regelt! Der Programmierer des Programms muss dann einfach diese Funktion aufrufen!
    Das mit den doppelten IDs sollte doch eigentlich einfach verhindert werden können: bei SetTimer für hWnd NULL angeben -> ID wird automatisch vergeben

    Ich hoffe mal, dass ich das ganze überhaupt richtig verstanden habe 🙄

    [ Dieser Beitrag wurde am 24.12.2002 um 10:54 Uhr von flenders editiert. ]



  • Original erstellt von flenders:
    Bastell dir doch einfach in deiner LIB eine Funktion, die die gewünschten Parameter hat und dann das ganze regelt! Der Programmierer des Programms muss dann einfach diese Funktion aufrufen!

    Ja, das hatte ich schonmal. Finde ich aber nicht so schön. Vor allem weiß ich nicht, wie das ganze in MFC aussieht. Deshalb habe ich mich einfach in die DefWindowProc mit reingeschrieben, sodass immer meine LibWndProc aufgerufen wird (welche dann natürlich wieder die alte WndProc aufruft, also ganz unbemerkt). Das Problem war jetzt, wie ich den this Zeiger in diese eigene WndProc reinschmuggeln kann.

    Das mit den doppelten IDs sollte doch eigentlich einfach verhindert werden können: bei SetTimer für hWnd NULL angeben -> ID wird automatisch vergeben

    Ne, dann wird ja keine Nachricht zum hWnd geschickt. Ach ne, ich kann ja einmal SetTimer ohne hWnd aufrufen, bekomme dardurch eine freie ID, danach ändere ich wieder über SetTimer die Timer Einstellungen. Ja, das müsste gehen. Danke


Anmelden zum Antworten