WaitWindowEvent mit Timeout

Anfängerfragen zum Programmieren mit PureBasic.
pol
Beiträge: 4
Registriert: 04.08.2007 22:38

WaitWindowEvent mit Timeout

Beitrag von pol »

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...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

öh... das is ne NULL dann...

kein event = 0

also, Case 0

öh.. ok?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
pol
Beiträge: 4
Registriert: 04.08.2007 22:38

Beitrag von pol »

richtig, leider wird dann aber auch auf andere Ereignisse (z.B. Fensterwechsel) reagiert :cry:

pol...
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 »

pol hat geschrieben:richtig, leider wird dann aber auch auf andere Ereignisse (z.B. Fensterwechsel) reagiert :cry:

pol...
Nein:

Code: Alles auswählen

Select WaitWindowEvent(100)
  Case #PB_Event_CloseWindow
  Case 0 ; timeout
EndSelect
wird nur abgearbeitet wenn kein Ereignis auftratt. Du kannst aber auch einen
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.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

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.
Bild
pol
Beiträge: 4
Registriert: 04.08.2007 22:38

Beitrag von pol »

sorry, aber

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
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...
pol
Beiträge: 4
Registriert: 04.08.2007 22:38

Beitrag von pol »

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
Diese Methode funktioniert bei mir in der Tat ohne Probleme. Vielen Dank für den Tip.

pol...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

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

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.
Antworten