私は自分の質問に答えるのに遅れていることを知っていますが、誰かの助けになることを願っています.
純粋にテストとして、Windows マルチメディア タイマーのラッパーを作成しました。うまく機能しているように見えますが、コードは完全にはテストされておらず、最適化もされていません。
mmtimer.py:
from ctypes import *
from ctypes.wintypes import UINT
from ctypes.wintypes import DWORD
timeproc = WINFUNCTYPE(None, c_uint, c_uint, DWORD, DWORD, DWORD)
timeSetEvent = windll.winmm.timeSetEvent
timeKillEvent = windll.winmm.timeKillEvent
class mmtimer:
def Tick(self):
self.tickFunc()
if not self.periodic:
self.stop()
def CallBack(self, uID, uMsg, dwUser, dw1, dw2):
if self.running:
self.Tick()
def __init__(self, interval, tickFunc, stopFunc=None, resolution=0, periodic=True):
self.interval = UINT(interval)
self.resolution = UINT(resolution)
self.tickFunc = tickFunc
self.stopFunc = stopFunc
self.periodic = periodic
self.id = None
self.running = False
self.calbckfn = timeproc(self.CallBack)
def start(self, instant=False):
if not self.running:
self.running = True
if instant:
self.Tick()
self.id = timeSetEvent(self.interval, self.resolution,
self.calbckfn, c_ulong(0),
c_uint(self.periodic))
def stop(self):
if self.running:
timeKillEvent(self.id)
self.running = False
if self.stopFunc:
self.stopFunc()
定期テスト コード:
from mmtimer import mmtimer
import time
def tick():
print("{0:.2f}".format(time.clock() * 1000))
t1 = mmtimer(10, tick)
time.clock()
t1.start(True)
time.sleep(0.1)
t1.stop()
ミリ秒単位の出力:
0.00
10.40
20.15
29.91
39.68
50.43
60.19
69.96
79.72
90.46
100.23
ワンショット テスト コード:
from mmtimer import mmtimer
import time
def tick():
print("{0:.2f}".format(time.clock() * 1000))
t1 = mmtimer(150, tick, periodic=False)
time.clock()
t1.start()
ミリ秒単位の出力:
150.17
結果からわかるように、それはかなり正確です。ただし、これはあくまでも使用time.clock()
なので、塩少々でお召し上がりください。
10 ミリ秒の定期タイマーを使用した長時間のテストでは、私の古いデュアル コード 3 GHz マシンの CPU 使用率は約 3% 以下です。ただし、マシンはアイドル時にもそれを使用しているように見えるため、追加の CPU 使用率は最小限であると言えます。