ich möchte in einem seperaten Thread einen Timer laufen lassen, der Sekunden rückwärts auf 0 zählt.
Was muss ich denn da bei event festlegen?
Egal wie ich`s mache: entweder reagiert der Zähler auch auf Mausbewegungen oder ich kann das Fenster nicht bewegen/schleßen.
Code: Alles auswählen
...
oMenu:AddItem({"Timer", {|| ExtraThread("timer") } })
...
#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
proc timer
//
LOCAL nEvent:=xbe_None, ;
min:=3,sec:=0, ;
BGfarbe:=GRA_CLR_WHITE, ;
T1farbe:=GRA_CLR_RED, ;
T2farbe:=GRA_CLR_BLUE
//
oDlgTi:= XbpDialog():new( AppDesktop(),SetAppWindow(), {0,0},{300*F,225*F})
oDlgTi:maxButton:= .F.
oDlgTi:title := "Timer"
oDlgTi:icon := 100
oDlgTi:Close := { || oDlgTi:destroy() }
oDlgTi:create()
oDlgTi:drawingArea:SetColorBG( BGfarbe )
center(oDlgTi)
//
StaTi1:= XbpStatic():new(oDlgTi,,{0,145*F},{300*F,45*F}, ;
{{XBP_PP_BGCLR,BGfarbe},{XBP_PP_FGCLR,T1farbe} } )
StaTi1:type := XBPSTATIC_TYPE_TEXT
StaTi1:setFontCompoundName( str(36*F/dpi,2,0)+".Arial" )
StaTi1:caption:="Restzeit:"
StaTi1:options := XBPSTATIC_TEXT_CENTER
StaTi1:create()
//
StaTi2:= XbpStatic():new(oDlgTi,,{0,0*F},{300*F,140*F}, ;
{{XBP_PP_BGCLR,BGfarbe},{XBP_PP_FGCLR,T2farbe} } )
StaTi2:type := XBPSTATIC_TYPE_TEXT
StaTi2:setFontCompoundName( str(96*F/dpi,3,0)+".Arial" )
StaTi2:caption:=str(min,1,0)+":"+strzero(sec,2,0)
StaTi2:options := XBPSTATIC_TEXT_CENTER
StaTi2:create()
//
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp, 100 )
//
if nEvent # xbe_None
oXbp:HandleEvent( nEvent, mp1, mp2 )
else
sec=sec-1
if sec < 0
sec=59
min=min-1
endif
//
if min < 0
msgbox("Die Zeit ist abgelaufen!")
exit
else
StaTi2:setCaption(str(min,1,0)+":"+strzero(sec,2,0))
endif
endif
//
ENDDO
//
oDlgTi:destroy()
//
return
#include "Thread.ch"
FUNCTION ExtraThread(ExPrg)
//
LOCAL oThread
oThread:=Thread():new()
oThread:setPriority( PRIORITY_NORMAL ) //HIGHEST )
oThread:start(ExPrg)
//
RETURN nil