みなさん、プログラムを制作していて、ここの処理を周期的に呼び出したいなぁって思うようなことないですか?
私は普段組み込みシステムの開発を行っているので、WindowsアプリやLinuxアプリ・Pythonアプリの制作を使用していて、あーここ周期処理にできたら簡単なんだけどなーって思ったりよくします。
シリアルやEthernetを使った通信系のアプリをプログラミングするときは特に思います。
Timerとは
ですので、今回は周期処理を可能とするTimer機能を紹介します。
今回使用するTimerは周期的にコールバック関数を呼び出ししてくれるものとなり、Threadの機能を使用しますので、メインのプロセスの処理に影響与えず使用できます。
threading ライブラリ を使用しますので、追加でライブラリ・モジュールをインストールする必要がありません。
サンプルコード
はい。ではいつも通りまずはコード全体を記載します。
import time
import threading
from logging import NullHandler
streamstop = False
tm = NullHandler
def tm_callback():
global tm
tm.cancel()
del tm
tm = NullHandler
print( time.time() )
if streamstop == False:
tm = threading.Timer( 1 , tm_callback )
tm.start()
def main_func( ):
global tm
tm = threading.Timer( 1 , tm_callback )
tm.start()
while True:
try:
pass
except KeyboardInterrupt:
print("stop")
streamstop = True
tm.cancel()
tm = NullHandler
break
if __name__ == '__main__':
result = main_func()
実行結果
ではこのプログラムを実行してみます。
以下の結果から、約1秒周期で呼ばれているのがお分かりいただけると思います。
WindowsでかつPythonでこの処理を行っていることとおそらくタイマの停止や再起動等の処理で、50ms程度ずつ遅延していますが、Windows上で作成するアプリとしてはシビアなことをしない限りは大きな問題にはならないと思います。

続いてはプログラムの解説ですが、解説は次ページにて記載します。
コメント