Seite 2 von 2

Verfasst: 22.11.2006 10:16
von Shardik
edel hat geschrieben: Wo hast du denn das her ? Die ID wird nur in Verbindung mit (d)einem
Fenster genutzt. Da kann man sehr wohl 0, 1 oder 2 schreiben.
Hast Du denn mein Beispiel einmal mit #TimerID=1 ausprobiert? Anscheinend wohl noch nicht... /:->

Du hast natürlich recht damit, daß die ID nur in Verbindung mit meinem Fenster genutzt wird. Aber in meinem Fenster werden anscheinend auch von Windows selbst (oder PureBASIC?) Timer-Routinen eingerichtet, die - wie in meinem Posting erwähnt - in Zusammenhang mit Popup-Hilfetexten und Ähnlichem stehen. Dies kann man leicht überprüfen, indem man meinen Beispiel-Code entsprechend abändert:

Code: Alles auswählen

    Repeat
      WindowEventID = WaitWindowEvent()

      If EventWindow() = 1
        If WindowEventID = #WM_TIMER
          Debug "Timer-Auslösung durch Timer-ID " + Str(EventwParam())

          If EventwParam() = #TimerID
            Debug Str(ElapsedMilliseconds()/1000 - InactivitySeconds) + " Sekunden sind seit dem letzten Timer-Ereignis vergangen..."
            InactivitySeconds = ElapsedMilliseconds() / 1000
          EndIf
        EndIf
      EndIF
    Until WindowEventID = #PB_Event_CloseWindow
Wenn man jetzt den Mauszeiger über der "Demo"-Schaltfläche plaziert, werden auch Timer-IDs 1 und/oder 3 angezeigt, die nicht von mir definiert wurden...
In einem "komplizierteren" Fenster habe ich so auch Timer-IDs von 1-4 finden können. Der Spuk von nicht korrekt eingehaltenen Zeitintervallen - wie auch von HemSA beschrieben - verschwindet aber sofort, wenn man eine hohe Timer-ID wie 123 verwendet. :wink:

Verfasst: 22.11.2006 10:40
von ts-soft
ID 0 soll man tatsächlich nicht verwenden, laut PSDK, hab aber noch nie
Probleme damit gehabt.
Timerereignisse sollten immer in einem Callback abgefangen werden, hier
nochmal der korrekte Code. Das der nicht ganz korrekte Code immer geht,
hat keiner gesagt :mrgreen:

Code: Alles auswählen

Procedure Alle4Sekunden(hWnd.l, uMsg, IDEvent, dwTime)
  Static InactivitySeconds, Init
  If Init = #False
    InactivitySeconds = ElapsedMilliseconds() / 1000
    Init = #True
  EndIf
  
  Select IDEvent
    Case 1
      Debug Str(ElapsedMilliseconds()/1000 - InactivitySeconds) + " Sekunden sind seit dem letzten Timer-Ereignis vergangen..."
      InactivitySeconds = ElapsedMilliseconds() / 1000
  EndSelect
EndProcedure


If OpenWindow(1, 0, 0, 100, 45, "Timer-Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  If CreateGadgetList(WindowID(1))
    ButtonGadget(1, 25, 10, 50, 20, "Demo")
    GadgetToolTip(1, "Jetzt werden fremde Timer-Ereignisse generiert...")

    SetTimer_(WindowID(1), 1, 4000, @Alle4Sekunden())

    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow

    KillTimer_(WindowID(1), 1)
  EndIf
EndIf

Verfasst: 25.11.2006 18:20
von HemSA
Danke nochmal an alle.
Werde meinen Code dementsprechend anpassen - keine "0" für die TimerID verwenden.