5
def On_Instrumentation_StartAnimation():  

    """
    Syntax      : On_Instrumentation_StartAnimation()
    Purpose     : Fired if the animation is started
    Parameters  : None
    """
    print "----------------------------------------------------------------------------------------"
    localtime = time.asctime(time.localtime(time.time()))
    global start
    start = time.clock()
    print "The user entered Animation Mode at local time: ", localtime
    print("This data has also been written to 'c:\dSPACE71\cdlog\cdlog.txt'")   
    threading.Timer(2, ExecuteDemo).start()
    ExecuteDemo()
    # Printing to the text file
    file1 = open('c:\dSPACE71\cdlog\cdlog.txt', 'a')
    file1.write("\n----------------------------------------------------------------------------------------")
    file1.write("\nThe user entered Animation Mode at local time: ")
    file1.write(localtime)
    file1.close()      

def ExecuteDemo()
    .
    .
    .
    Current_value = Current.Read()
    localtime = time.asctime(time.localtime(time.time()))
    print "The current reading at localtime:", localtime, "is", str(Current_value) + "."
    # Printing to the text file
    file1 = open('c:\dSPACE71\cdlog\cdlog.txt', 'a')
    file1.write("\n----------------------------------------------------------------------------------------")
    file1.write("\nThe current reading at localtime: ")
    file1.write(localtime)
    file1.write(" is: ")
    file1.write(str(Current_value))
    file1.close()
    .
    .
    .

ご覧のとおり、StartAnimation関数が呼び出された後、2秒ごとにExecuteDemo()関数を繰り返そうとしています。しかし、ここでの私の問題は、ExecuteDemo()が2回しか実行されないことです。どうすれば繰り返し続けることができますか?私は何かが足りないのですか?

4

4 に答える 4

13

ドキュメントから:

クラスthreading.Timer

指定された間隔が経過した後に関数を実行するスレッド。

これは、指定された時間が経過するThreading.Timer関数を呼び出すことを意味します。お気づきのように、一度だけ呼び出されます。ここでの解決策は、関数の最後にタイマーをもう一度設定することです。ExecuteDemo(..)

def ExecuteDemo():
    .
    .
    .
    threading.Timer(2, ExecuteDemo).start()

私の意見では、上記の方法は少し非効率的です。これは、2秒ごとに新しいスレッドが作成されているようなもので、関数を実行すると、次のスレッドを作成する前に停止します。

私はこのようなものを提案します:

def ExecuteDemoCaller():
    #while True: # or something..
    while someCondition:
        ExecuteDemo()
        time.sleep(2)
于 2012-06-20T17:23:59.253 に答える
1

ドキュメントから:

class threading.Timer( interval , function , args =[], kwargs ={})¶ interval秒が経過した後、引数argsとキーワード引数kwargsで関数を実行するタイマーを作成します。

何かを繰り返し呼び出すことについては何も見つかりませんでした。他の誰かがより良い答えを持っているかもしれませんし、それをハンドロールする必要があるかもしれません (それほど難しくありません)。

于 2012-06-20T17:20:32.593 に答える
0

タイマーは繰り返さない。コールバック関数の最後に別のタイマーを設定するだけです。

于 2012-06-20T17:22:30.767 に答える