ganze Menge User gibt, die keine UserLibraries mögen, hab ich den
C-Source von Danilo mal nach PureBasic übersetzt.
Functionsnamen wurden angepaßt, um Konflikte mit der Lib zu vermeiden.
"Timer_Include.pbi"
Code: Alles auswählen
; /*
;  *
;  *  Copyright (c) 2002-2005 by Danilo Krahn
;  *
;  *    This library is free software; you can redistribute it and/or
;  *    modify it under the terms of the GNU Lesser General Public
;  *    License As published by the Free Software Foundation; either
;  *    version 2.1 of the License, Or (at your option) any later version.
;  *
;  *    This library is distributed in the hope that it will be useful,
;  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
;  *    MERCHANTABILITY Or FITNESS For A PARTICULAR PURPOSE.  See the GNU
;  *    Lesser General Public License For more details.
;  *
;  */
; changed from C to PB by ts-soft
; Diese Include enthält alle Funktionen der PBOSL_Timer Lib von Danilo Krahn
; Die Funktionsnamen wurden angepaßt, um konflikte mit der UserLib zu vermeiden
; Desweiteren ist vor Verwendung der Funktionen Timer_Init() aufzurufen
; Am Ende dann Timer_End()
; StartTimer() = TimerStart()
; EndTimer() = TimerStop()
; GetMinTimerResolution() = TimerGetMinRes()
; GetMaxTimerResolution() = TimerGetMaxRes()
Define TimerResolution.TIMECAPS
Global Dim TimerHandles(15)
Global Dim TimerProcedures(15)
Procedure Timer_Init()
  Shared TimerResolution
  If timeGetDevCaps_(@TimerResolution, SizeOf(TIMECAPS)) = #TIMERR_NOERROR
    If timeBeginPeriod_(TimerResolution\wPeriodMin) = #TIMERR_NOERROR
      ProcedureReturn #True
    EndIf
  EndIf
  ProcedureReturn #False
EndProcedure
Procedure Timer_End()
  Protected I
  Shared TimerResolution
  timeEndPeriod_(TimerResolution\wPeriodMin)
  For I = 0 To 15
    If TimerHandles(I)
      timeKillEvent_(TimerHandles(I))
    EndIf
  Next
EndProcedure
Procedure Timer_Callback(TimerHandle, Message, TimerID, wParam, lParam)
  If TimerProcedures(TimerID)
    CallFunctionFast(TimerProcedures(TimerID))
  EndIf
EndProcedure
Procedure TimerStart(TimerID, Delay, ProcAddr)
  If TimerID > 15 Or TimerID < 0 : ProcedureReturn #False : EndIf
  If TimerHandles(TimerID)
    timeKillEvent_(TimerHandles(TimerID))
  EndIf
  TimerProcedures(TimerID) = ProcAddr
  TimerHandles(TimerID) = timeSetEvent_(Delay, 0, @Timer_Callback(), TimerID, #TIME_PERIODIC)
  ProcedureReturn TimerHandles(TimerID)
EndProcedure
Procedure TimerStop(TimerID)
  If TimerID > 15 Or TimerID < 0 : ProcedureReturn #False : EndIf
  If TimerHandles(TimerID)
    timeKillEvent_(TimerHandles(TimerID))
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure
Procedure TimerGetMaxRes()
  Shared TimerResolution
  ProcedureReturn TimerResolution\wPeriodMax
EndProcedure
Procedure TimerGetMinRes()
  Shared TimerResolution
  ProcedureReturn TimerResolution\wPeriodMin
EndProcedure
"Timer-TEST 1.pb"
Code: Alles auswählen
XIncludeFile "Timer_Include.pbi"
Procedure mytimer1()
  Shared hoehe
  If hoehe = 1000: hoehe = 100: EndIf
     Beep_(hoehe,100)
  hoehe+100
EndProcedure
Procedure mytimer2()
   Beep_(1800,5)
EndProcedure
Procedure mytimer3()
   Beep_(1800,100)
EndProcedure
Procedure mytimer4()
   Beep_(800,100)
EndProcedure
Timer_Init()
hWnd = OpenWindow(0, (GetSystemMetrics_(#SM_CXSCREEN)-200)/2,(GetSystemMetrics_(#SM_CYSCREEN)-277)/2, 400, 360, "High Resolution Timer by Danilo", #PB_Window_SystemMenu|#PB_Window_SizeGadget)
TimerStart(0, 1000, @mytimer1())
TimerStart(1,  200, @mytimer2())
TimerStart(2, 2000, @mytimer3())
TimerStart(3,  600, @mytimer4())
Repeat
  EventID.l=WaitWindowEvent()
  ; IF LeftMouseButton pressed...
  If EventID = #WM_LBUTTONDOWN
    TimerStop(1): TimerStop(2): TimerStop(3)
  EndIf
  ; pressed CloseButton or ALT+F4 ??
  If EventID = #PB_Event_CloseWindow
     Quit = 1
  EndIf
Until Quit = 1
Timer_End()
Code: Alles auswählen
XIncludeFile "Timer_Include.pbi"
Timer_Init()
Global myText$
Global hWnd.l
Global TextLength.l
#ScrollSpeed_in_Milliseconds = 70
myText$ = "     This is a little Scroller-Test with the Timer by Danilo     "
TextLength = Len(myText$)
Procedure Scroller()
  ;Shared Scroller_a
  Shared Scroller_Position
  Shared Scroller_Direction
  If Scroller_Position < TextLength + 1 And Scroller_Direction = 0
      TEMP$ = Right(myText$,Scroller_Position)
      SetWindowText_(hWnd, TEMP$)
      Scroller_Position+1
  Else
      Scroller_Direction = 1
      TEMP$ = Right(myText$,Scroller_Position)
      SetWindowText_(hWnd, TEMP$)
      Scroller_Position-1
      If Scroller_Position = 0 : Scroller_Direction = 0 : EndIf
  EndIf
EndProcedure
Procedure mybeep()
  Beep_(500,1000)
  TimerStop(0)
  DisableGadget(1,0)
  TimerStart(1, #ScrollSpeed_in_Milliseconds, @Scroller())
EndProcedure
Procedure Alarm()
  Beep_(500,60)
EndProcedure
MessageRequester("Minimal Timer Resolution",Str(TimerGetMinRes()),0)
MessageRequester("Maximal Timer Resolution",Str(TimerGetMaxRes()),0)
hWnd = OpenWindow(0, (GetSystemMetrics_(#SM_CXSCREEN)-400)/2,(GetSystemMetrics_(#SM_CYSCREEN)-100)/2, 400, 100,"", #PB_Window_SystemMenu)
If CreateGadgetList(WindowID(0))
  ButtonGadget(0,  10, 10, 100, 25, "Quit Scroller")
  DisableGadget(0,1)
  ButtonGadget(1, 120, 10, 250, 25, "Change Timer from Scroller to Beep")
  DisableGadget(1,1)
EndIf
SetForegroundWindow_(hWnd)
TimerStart(0,1000, @mybeep())
Repeat
  EventID.l=WaitWindowEvent()
  ; IF LeftMouseButton pressed...
  If EventID = #WM_LBUTTONDOWN
    SendMessage_(hWnd.l,#WM_NCLBUTTONDOWN, #HTCAPTION,0)
  EndIf
  If EventID = #PB_Event_Gadget
    Select EventGadget()
      Case 0 ; End the Timer
        A$ = GetGadgetText(0)
        If A$ = "Quit Alarm"
         SetGadgetText(0,"Exit Program")
         DisableGadget(1,1)
        EndIf
        If A$ = "Exit Program"
         Quit = 1
        EndIf
        TimerStop(1)
      Case 1
        SetGadgetText(0,"Quit Alarm")
        DisableGadget(0,0)
        TimerStart(1, 100, @Alarm())
    EndSelect
  EndIf
  ; pressed CloseButton or ALT+F4 ??
  If EventID = #PB_Event_CloseWindow
    Quit = 1
  EndIf
Until Quit = 1
Timer_End()
Dieser Source befindet sich jetzt auch im IncludePack
http://www.purebasic.fr/german/viewtopic.php?t=9190
Gruß
Thomas
