Seite 2 von 3

Verfasst: 24.05.2009 14:11
von cxAlex
Danke, schön das du meinen Code brauchen kannst.
Das mit dem Delay stell ich für die nächste Version wieder um. (Die nenne ich dann mal 1.0)

> Vielleicht die Eventkennung su umbauen das man in der eigenen Thread noch den Pause und Free abfragen kann um noch wichtige verarbeitungen durchführen kann

Ich hab nicht ganz verstanden was du meinst?


Gruß, Alex

Verfasst: 24.05.2009 14:21
von mk-soft
Ihr noch dein letzter Code mit der Anpassung mit Delay(...)

Code: Alles auswählen

; ; ------------------------------------------------------------------------------------
; Easy Timer
; Einfacher leicht erweiterbarer Timer
; PB 4.3 +
; Alexander Aigner
; ------------------------------------------------------------------------------------

; ------------------------------------------------------------------------------------
; Internes Zeugs
; ------------------------------------------------------------------------------------

Prototype HR_Time()

Structure _HR_Internal
  TicksPerSecond.l
  Frequency.q
  StartTime.q
EndStructure

Define _HR._HR_Internal
Global GetTimeMS.HR_Time

Procedure _HR_InitTime()
  Shared _HR._HR_Internal
  With _HR
    If Not QueryPerformanceFrequency_(@\Frequency)
      ProcedureReturn 0
    Else
      QueryPerformanceCounter_(@\StartTime)
      \TicksPerSecond = 1000 ; 1000 = Millisekunden
      ProcedureReturn 1
    EndIf
  EndWith
EndProcedure

Procedure _HR_Get()
  Shared _HR._HR_Internal
  Protected currentTime.q
  With _HR
    QueryPerformanceCounter_(@currentTime)
    ProcedureReturn (currentTime-\StartTime)*\TicksPerSecond/\Frequency
  EndWith
EndProcedure

Procedure _HR_oldPC_or_Linux()
  ProcedureReturn ElapsedMilliseconds()
EndProcedure

CompilerIf #PB_Compiler_OS<>#PB_OS_Windows
  GetTimeMS = @_HR_oldPC_or_Linux()
CompilerElse
  If _HR_InitTime()
    GetTimeMS = @_HR_Get()
  Else
    GetTimeMS = @_HR_oldPC_or_Linux()
  EndIf
CompilerEndIf

Prototype ET_Procedure(UserData)

Structure ET_Data
  *CB.ET_Procedure
  UserData.i
  Delay.i
  CBEventStop.i
  CBEventPause.i
EndStructure

Procedure _ET_Thread(*ET.ET_Data)
  Protected dTime, cTime, wTime
  With *ET
    Repeat
     
      wTime = \Delay - dTime
      cTime = GetTimeMS()
      If wTime > 50
        Delay(wtime)
      Else
        While wTime > GetTimeMS()-cTime
          Delay(1)
        Wend
      EndIf
      
      If \CBEventPause ; Pausesignal
        WaitSemaphore(\CBEventPause)
      EndIf
      If \CBEventStop ; Stopsignal
        SignalSemaphore(\CBEventStop)
        ProcedureReturn #Null
      EndIf
     
      ; Callback aufrufen und Ausgelichszeit errechnen
      cTime = GetTimeMS()
      \CB(\UserData)
      dTime = GetTimeMS()-cTime
     
      ; Delay(<0) = warte unendlich
      If dTime<0
        dTime = 0
      ElseIf dTime>\Delay
        dTime = \Delay
      EndIf
     
    ForEver
  EndWith
EndProcedure

; ------------------------------------------------------------------------------------
; Proceduren
; ------------------------------------------------------------------------------------

; Neuen Timer anlegen
Procedure ET_New(*Callback.ET_Procedure, Delay.i, UserData.i)
  Protected *ET.ET_Data = AllocateMemory(SizeOf(ET_Data))
  With *ET
    \CB = *Callback
    \Delay = Delay
    \UserData = UserData
    CreateThread(@_ET_Thread(), *ET)
    ProcedureReturn *ET
  EndWith
EndProcedure

; Timer pausieren
Procedure ET_Pause(*ET.ET_Data)
  With *ET
    If Not \CBEventPause
      \CBEventPause = CreateSemaphore()
    EndIf
  EndWith
EndProcedure

; Timer fortsetzen
Procedure ET_Resume(*ET.ET_Data)
  With *ET
    If \CBEventPause
      SignalSemaphore(\CBEventPause)
      FreeSemaphore(\CBEventPause)
    EndIf
  EndWith
EndProcedure

; Timer freigeben
Procedure ET_Free(*ET.ET_Data)
  With *ET
    \CBEventStop = CreateSemaphore()
    ET_Resume(*ET) ; Wenn nötig fortsetzen
    WaitSemaphore(\CBEventStop)
    FreeSemaphore(\CBEventStop)
    FreeMemory(*ET)
  EndWith
EndProcedure

; ------------------------------------------------------------------------------------
; Test
; ------------------------------------------------------------------------------------

Procedure Test(Dummy)
  Static x, lT, cT
  cT = GetTimeMs()
  If lT
    Debug "Getriggert nach " + Str(cT-lT)+" ms"
  Else
    Debug "Timer Initialisiert"
  EndIf
  lT = ct
  x +1
  ;Debug x
EndProcedure

; Test alle 100 ms aufrufen

Timer1 = ET_New(@Test(), 45, #Null)
Delay(1010)
; Timer freigeben
ET_Free(Timer1)

Mit den Event meine ich das der Callback noch einmal aufgerufen wird mit der Info das ein Pause, Resume oder eine Free ansteht.

P.S. Die Callback Procdure mit ein weiteren Parameter versorgen
z.B. Test(Event, UserData)

Verfasst: 24.05.2009 15:03
von cxAlex
Achso. Kein Problem, ist machbar.

Verfasst: 24.05.2009 15:09
von cxAlex
Update:
  • Delay wieder umgebaut
  • Events eingeführt
  • Versionsnummer eingeführt: 1.0
Code im 1. Post.

Gruß, Alex

Verfasst: 24.05.2009 15:21
von mk-soft
:allright:

Verfasst: 05.07.2009 17:32
von cxAlex
Update:

Pausieren/Beenden funktionieren nun unabhängig vom Timer-Delay.

Code im 1. Post

Gruß, Alex

Verfasst: 05.07.2009 17:42
von Andesdaf
Dankeschön. :D

Re: EasyTimer

Verfasst: 03.04.2011 11:26
von hiltwin
Sorry, dass ich diesen älteren Thread noch mal an die Oberfläche befördere.

Der Timer gefällt mir ja prima. Allerdings funktioniert die Systrayfunktion nicht komplett.

Auf dem kompilierenden Rechner wird das Programm korrekt mit Icon dargestellt, auf anderen PCs allerdings nicht. Beide PC haben Windows XP Home SP 3 - also identische Betriebssysteme.

Jemand eine Idee, woran das liegt?

Diese Variante - der Code von mk-soft - funktioniert auf mehreren Rechnern ...

http://forums.purebasic.com/german/view ... =16&t=9577

Re: EasyTimer

Verfasst: 03.04.2011 12:03
von c4s
hiltwin hat geschrieben:Sorry, dass ich diesen älteren Thread noch mal an die Oberfläche befördere.

Der Timer gefällt mir ja prima. Allerdings funktioniert die Systrayfunktion nicht komplett.

Auf dem kompilierenden Rechner wird das Programm korrekt mit Icon dargestellt, auf anderen PCs allerdings nicht. Beide PC haben Windows XP Home SP 3 - also identische Betriebssysteme.

Jemand eine Idee, woran das liegt?

Diese Variante - der Code von mk-soft - funktioniert auf mehreren Rechnern ...

http://forums.purebasic.com/german/view ... =16&t=9577
Worauf beziehst du dich?
Der Code von cxAlex (erster Post) hat keine SysTray-Funktion. Sonst einfach mal in der Hilfe den SysTray-Bereich nachschlagen...

Re: EasyTimer

Verfasst: 03.04.2011 13:20
von hiltwin
c4s hat geschrieben:Worauf beziehst du dich?
Der Code von cxAlex (erster Post) hat keine SysTray-Funktion. Sonst einfach mal in der Hilfe den SysTray-Bereich nachschlagen...
Mist - Sonntag morgen :|

cxAlex hat den fast identischen Code auch noch mal hier gepostet - inclusive SysTray - mit der oben beschriebenen Fehlfunktion ...

http://forums.purebasic.com/german/view ... 2e13855e06