2016-06-30 1 views
0

私はいくつかのコードを実行し、n分ごとに実行し、いくつかの値を更新します。私は条件付きでこれらの値をチェックし、必要に応じてLEDを点滅させるループを呼び出します。ループの機能は次のようになります。無限ループに陥ることなく連続してループを実行する方法を教えてください。

def blink_led_constant 
    while 1 
     # RPi::GPIO.set_high 18 
     # sleep(1) 
     # RPi::GPIO.set_low 18 
     # sleep(1) 
    end 
end 

基本的には、このLEDがある条件を満たすまでバックグラウンドで点滅します。これを実行するように設定するにはどうすればよいですか?また、関数呼び出しを続けてプログラムを繰り返しますか?

これは私がこれを書いたところに基づいています。この関数が呼び出されると、無限に固まってしまいます。

ありがとうございました

+0

あなたはどの言語でコードを書いていましたか? – dorukayhan

+0

タグ –

+0

のk.hredosに感謝します。ルビーで書かれています –

答えて

3

スレッドを使用してこれを行うことができます。

def blink_led_constant 
    loop do 
    # RPi::GPIO.set_high 18 
    # sleep(1) 
    # RPi::GPIO.set_low 18 
    # sleep(1) 
    end 
end 

thread = Thread.new { blink_led_constant } 

blink_led_constantがバックグラウンドで実行されている間に、他のコマンドを実行することができます。条件が満たされた後で壊れたければ、loop dowhileに変更します。 LEDが点滅しないように条件が満たされると、Thread.kill(thread)またはthread.killが呼び出されます。

+0

LEDを点滅させる条件がなくなったときにスレッドを停止する方法を指定することができます –

+0

OK、$ on == trueの間にcondition:loopで関数を定義しました。 とblinkthread = Thread.new DO blink_led_constant エンド を定義したが、私はスレッド::開始(blinkthread) を呼び出すときにしたいならば、私は、ブロック –

+0

いくつかのヒントなしたProcオブジェクトを作成しようとしたというエラーを取得します'on'が真であるときに実行するループは' while on'を呼び出します。次に、 'Thread :: start(blinkthread)'を呼び出さず、 'Thread.new'を呼び出してブロックを自動的に開始します。第三に、スレッドを 'blinkthread = Thread.new {blink_led_constant}'と定義します。 'do ... end'ではありません。 –

関連する問題