2017-03-11 25 views
2

私は数日間問題を抱えています。私はメッセージボードを検索する時間を費やし、空になった。whileループでスレッドを使用すると、LEDの点滅で問題が発生する

APIからデータを取り出し、JSONで解析してLCD画面に表示するプログラムがあります。データが一定の条件を満たすと、LEDライトが点滅します。私はこれまでかなり成功しています。私が実行している問題は、メインwhileループから点滅を開始するスレッドが呼び出され、メインwhileループが再起動したときにスレッドが再度呼び出されたように見えるときです。これにより、各LEDがループ再起動している間、私のLEDが不器用な動作を開始します。助言がありますか?

スレッドが再起動しないように、v.isAlive()== False "を使ってみましたが、役に立たなかったのですが、条件が満たされるとスレッドを一度起動してから、条件が満たされなくなるまで、LED、私はLCD画面を使用しているので、データが連続ループである。ここ

は私のプログラムの非常に単純化されたスニペットです:。。

def partCloudBlink(): 
while True: 
    allLEDon() 
    time.sleep(2.5) 
    yellowLEDon() 
    time.sleep(1) 
    allLEDoff() 

def partCloudBlink_start(): 
v = threading.Thread(target=partCloudBlink) 
if v.isAlive() == False: 
    v.daemon = True 
    v.start() 

RUNNING = True 

try: 
    while RUNNING: 
     if weather in ("Partly Cloudy"): 
      partCloudBlink_start() 

     print "Current conditions: %s" % (conditions) #unrelated to the question, just program filler 

except KeyboardInterrupt: 
    RUNNING = False 

ありがとうございました

答えて

0

毎回新しいスレッドオブジェクトが作成されるためですが呼び出されます。 v.isAlive()は新しいスレッドなので、常にFalseです。

コード構造に応じて、スレッドオブジェクトを格納するためのグローバル変数などを作成できます。

+0

私はPartCloudBlink_start()を変数にしようとしましたが、その変数をスクリプトで実行したところ、完全に機能しました。 –

+0

それは働いた。 ..その後4または5ループが狂った動作を開始しました。スレッド自体が再開し続けるように見えます。私はスレッドの実行の何百回も反復することになります。 –

+0

「PartCloudBlink_start'変数を作成する」ことがわかりません。 'partCloudBlink_start'の変数' v'を参照してください。新しいスレッドが作成され、 'v'に割り当てられたときに呼び出されます。そのため、何百ものスレッドが実行されています。 – Liteye

関連する問題