WaitWindowEvent mit Timeout
WaitWindowEvent mit Timeout
MoinMoin
Ich suche eine Möglichkeit das Event 'Timeout abgelaufen' auszuwerten:
Event = WaitWindowEvent(Timeout)
Select Event
Case #PB_Event_Gadget
...blabla
Case #PB_Event_CloseWindow
... alles beenden
Case was_muss_hier_stehen
--> hier steht der Code der nur nach dem Timeout abgearbeitet werden soll
Endselect
Leider hab' ich in der Hilfe bisher kein Codebeispiel finden können. Vielleicht kann mir jemand auf die Sprünge helfen.
Danke im Voraus
pol...
Ich suche eine Möglichkeit das Event 'Timeout abgelaufen' auszuwerten:
Event = WaitWindowEvent(Timeout)
Select Event
Case #PB_Event_Gadget
...blabla
Case #PB_Event_CloseWindow
... alles beenden
Case was_muss_hier_stehen
--> hier steht der Code der nur nach dem Timeout abgearbeitet werden soll
Endselect
Leider hab' ich in der Hilfe bisher kein Codebeispiel finden können. Vielleicht kann mir jemand auf die Sprünge helfen.
Danke im Voraus
pol...
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- 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
Nein:pol hat geschrieben:richtig, leider wird dann aber auch auf andere Ereignisse (z.B. Fensterwechsel) reagiert![]()
pol...
Code: Alles auswählen
Select WaitWindowEvent(100)
Case #PB_Event_CloseWindow
Case 0 ; timeout
EndSelect
Timer nehmen, samt Timercallback
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
dann würde ich noch zusätzlich nen focus-check einfügen...
aber eigentlich müsste doch "focus lost" ne eigene event-ID tragen...
ich versteh grad das problem nur teilweise...
wenn die EventID = 0 ist, sollte eigentlich generell das Timeout abgelaufen sein...
was willst du denn machen, dass du bei nem timeout was tun willst?
ich kenn das vom aktualisieren von gadgets, wo die aktuelisierung selber nen event erzeugt.
dort funktioniert die =0 lösung zuverlässig...
[edit]
ok... ol' ts war mal wieder schneller.
war echt dein problem, dass du die NULL nicht explizit erfragt hast?
aber eigentlich müsste doch "focus lost" ne eigene event-ID tragen...
ich versteh grad das problem nur teilweise...
wenn die EventID = 0 ist, sollte eigentlich generell das Timeout abgelaufen sein...
was willst du denn machen, dass du bei nem timeout was tun willst?
ich kenn das vom aktualisieren von gadgets, wo die aktuelisierung selber nen event erzeugt.
dort funktioniert die =0 lösung zuverlässig...
[edit]
ok... ol' ts war mal wieder schneller.
war echt dein problem, dass du die NULL nicht explizit erfragt hast?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- 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
Besser einen richtigen Timer nehmen:
Code: Alles auswählen
Procedure TimerProc(hWnd.l, uMsg.l, idEvent.l, dwTime.l)
If idEvent = 1
Debug "hallo"
EndIf
EndProcedure
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "test")
SetTimer_(WindowID(0), 1, 100, @TimerProc())
While WaitWindowEvent() <> 16 : Wend
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

sorry, aber
führt bei mir zu dreimaliger Ausgabe derselben Uhrzeit. Außerdem wird bei Click in ein anderes geöffnetes Fenster ebenfalls teilweise die Debug-Ausgabe ausgelöst (PB-Version ist 4.02).
Die Lösung mit dem Extra-Timer muß ich mir nochmal etwas genauer ansehen, das ist 'hard Stuff' für mich...
Benötigt wird das ganze für ein Tool, welches das lokale Netzwerk scannt (ursprünglicher Source ist nicht auf meinem Mist gewachsten) und - falls kein weiterer PC mehr eingeschaltet ist - den Rechner herunterfährt. Das darf aber erst nach mehreren erfolglosen Scanversuchen passieren. Dazu benötige ich den Timerevent - und nur den.
Vielen Dank schonmal für die Tips.
pol...
Code: Alles auswählen
If OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "test")
Repeat
Select WaitWindowEvent(10000)
Case #PB_Event_CloseWindow
End
Case 0 ; timeout
Debug FormatDate("%hh:%ii:%ss", Date())
EndSelect
ForEver
EndIf
Die Lösung mit dem Extra-Timer muß ich mir nochmal etwas genauer ansehen, das ist 'hard Stuff' für mich...
Benötigt wird das ganze für ein Tool, welches das lokale Netzwerk scannt (ursprünglicher Source ist nicht auf meinem Mist gewachsten) und - falls kein weiterer PC mehr eingeschaltet ist - den Rechner herunterfährt. Das darf aber erst nach mehreren erfolglosen Scanversuchen passieren. Dazu benötige ich den Timerevent - und nur den.
Vielen Dank schonmal für die Tips.
pol...
Diese Methode funktioniert bei mir in der Tat ohne Probleme. Vielen Dank für den Tip.ts-soft hat geschrieben:Besser einen richtigen Timer nehmen:
Code: Alles auswählen
Procedure TimerProc(hWnd.l, uMsg.l, idEvent.l, dwTime.l) If idEvent = 1 Debug "hallo" EndIf EndProcedure If OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "test") SetTimer_(WindowID(0), 1, 100, @TimerProc()) While WaitWindowEvent() <> 16 : Wend EndIf
pol...
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
klar funktioniert ein timer-callback besser...
aber den hätt's nicht mal gebraucht..
ich frag mich auch grad, wozu dein prozess unbedingt ein fenster brauchte,
und selbst wenn, warum den timer nich in nem sub-prozess arbeiten lassen,
dann hätte dir ein simples Delay() genügt.
und selbst wenn es unbedingt in der haupt-eventschleife sein sollte -
es gibt schließlich auch noch ElapsedMilliseconds, mittels dessen man im
Event-0-Branch hätte testen können, wieviel zeit nun wirklich verstrichen ist....
also, es wäre auch ohne timer-callback und mit WaitWindowEvent(25) zu lösen gewesen...
[edit]
so zum bleistift
aber den hätt's nicht mal gebraucht..
ich frag mich auch grad, wozu dein prozess unbedingt ein fenster brauchte,
und selbst wenn, warum den timer nich in nem sub-prozess arbeiten lassen,
dann hätte dir ein simples Delay() genügt.
und selbst wenn es unbedingt in der haupt-eventschleife sein sollte -
es gibt schließlich auch noch ElapsedMilliseconds, mittels dessen man im
Event-0-Branch hätte testen können, wieviel zeit nun wirklich verstrichen ist....
also, es wäre auch ohne timer-callback und mit WaitWindowEvent(25) zu lösen gewesen...

[edit]
so zum bleistift
Code: Alles auswählen
EnableExplicit
OpenWindow(0, #PB_Ignore, #PB_Ignore, 300,200,"Timer Demo")
CreateGadgetList(WindowID(0))
TextGadget(0,20,20,110,160,"")
TextGadget(1,200,20,80,20,"",#PB_Text_Center | #PB_Text_Border)
Define a$ = ""
Define.l EvID, ActTime, Timer, Timerstep, EXIT
Repeat
EvID = WaitWindowEvent(25)
Select EvID
Case 0
; ***********************************
; **** Timer Code
ActTime = ElapsedMilliseconds()
If ActTime > Timer
Timer = ActTime + 5000 ; zum testen mal 5 sec.
Timerstep +1
a$ + "Timerstep: " + Str(Timerstep) + #CRLF$
SetGadgetText(0,a$)
If Timerstep > 5
EXIT = #True
EndIf
EndIf
; ***********************************
SetGadgetText(1, FormatDate("%hh:%ii:%ss", Date()) )
Case #PB_Event_CloseWindow
EXIT = #True
EndSelect
Until EXIT
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.