SetTimer_(0,0,4000,@Hidewin())

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
HemSA
Beiträge: 221
Registriert: 16.10.2005 13:59
Wohnort: Manisa / Türkei
Kontaktdaten:

Beitrag von HemSA »

Danke nochmal an alle.
Werde meinen Code dementsprechend anpassen - keine "0" für die TimerID verwenden.
PB 4.02 (wegen Disphelper), 5.72 (Windows) (x64)
Antworten