EasyTimer
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
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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Ihr noch dein letzter Code mit der Anpassung mit Delay(...)
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)
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)
P.S. Die Callback Procdure mit ein weiteren Parameter versorgen
z.B. Test(Event, UserData)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Achso. Kein Problem, ist machbar.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Update:
Gruß, Alex
- Delay wieder umgebaut
- Events eingeführt
- Versionsnummer eingeführt: 1.0
Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Update:
Pausieren/Beenden funktionieren nun unabhängig vom Timer-Delay.
Code im 1. Post
Gruß, Alex
Pausieren/Beenden funktionieren nun unabhängig vom Timer-Delay.
Code im 1. Post
Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Re: EasyTimer
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
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
Worauf beziehst du dich?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
Der Code von cxAlex (erster Post) hat keine SysTray-Funktion. Sonst einfach mal in der Hilfe den SysTray-Bereich nachschlagen...
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Re: EasyTimer
Mist - Sonntag morgenc4s 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...

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