2015-08-15 24 views
0

我在這裏抓我的頭,不知道這是否是正確的方式來處理它,但現在我不能想到另一種方式(開放的建議)。所以我正在運行BACpypes庫,它需要您創建一個設備,然後應用程序調用run(),它啓動網絡上的設備。thread.timer運行之間傳遞值

我想要做的是每隔幾分鐘發送一次write_property命令到設備,但問題是我只能在我調用run()方法(初始化並託管設備)後才能這樣做,只要我這樣做,沒有什麼超越該方法被調用,直到我完全停止該程序,因爲它是一個單線程應用程序

所以我想創建一個名爲Update的方法,它將每隔30秒運行一次,然後嘗試寫入設備thread.Timer(因爲它然後運行在一個單獨的線程上)。我遇到的問題是我用來寫入設備的Update方法在運行run()命令之前無法執行,但我必須在run()命令之前執行我的方法,否則它將永遠不會執行。基本上我想知道的是我可以發送一個布爾到我的更新方法,這將阻止它第一次運行write_property,以便它可以等到run()已被執行,然後每次都可以嘗試寫入它?也許只是添加一個try/catch並跳過?

看起來什麼類似的代碼

例如:(這是我的主要try塊)

isFirstRun = False 
try: 
    test_device = LocalDeviceObject(...) 
    this_application = Application(test_device, args.ini.address) 

    Update(None,this_application, isFirstRun) 

    run() 

更新方法:

def Update(client, app, isFirstRun): 
    threading.Timer(30.0, Update, [client,app, isFirstRun]).start() 
    if the run() method hasnt been called yet 
     skip 
    else if it has 
     execute rest of code 

回答

0

而不是直接調用Update,爲什麼不叫threading.Timer(...)在主線程以及?這種方式Update將不會開始運行,直到經過30秒後,這看起來與您對布爾人所做的相同,但不會太笨重。

+0

我原本試過,它沒有工作,現在它突然工作.....大聲笑 – john