2016-04-24 9 views
0

私は新しいスレッドや新しいものをPythonに追加しました。私は複数の質問をしましたが、何らかの理由で正しい結果を得られません。Multiplethreadingは2番目のスレッドを一時停止します

LED(数値)状態(真/偽)を表示するアプリケーションがあります。点滅して2秒間待機してから2秒間待機するようにします。各変更後にどの状態になっているかを表示します。

LED: 15 State: True 
LED: 16 State: True 
LED: 16 State: False 
LED: 15 State: False 

、代わりに私が

LED: 15 State: True 
LED: 15 State: False 
LED: 16 State: True 
LED: 16 State: False 

取得し、コード自体:私はこれら二つの私の予測出力は次のようになります1は2秒1 5の点滅間の遅延を持っているそれらのLEDの2作成しました:

import time 
from threading import Thread 

class ledController(Thread): 
    #static variables 
    def __init__(self, GPIO, state=False): # x = " " - Default variable if user leaves it empty 
     self.GPIO = GPIO 
     self.state = state #Default LED state is off 
    def ledSwitch(self): 
     self.state = not self.state 
    def ledON(self): 
     self.state = True 
    def ledOFF(self): 
     self.state = False 

    def ledBlink(self, duration): 
     self.ledON() 
     print(self.ledDetails()) 
     time.sleep(duration) 
     self.ledOFF() 
     print(self.ledDetails()) 
     time.sleep(duration) 

    def ledDetails(self): 
     return "LED: " + str(self.GPIO) + " State: " + str(self.state) 


redLED = ledController(15) 
blueLED = ledController(16, True) 

redLED.ledBlink(5) 
blueLED.ledBlink(2) 
+0

あなたが実際にスレッドを作成していないので、すべてがダウン有権者順次 –

答えて

1

マルチスレッド機能をまったく使用していませんでした。スレッドモジュールメソッドをあなたのクラスで派生させただけですが、使用しませんでした。以下のように

import time 
import thread 

class ledController(): 
    #static variables 
    def __init__(self, GPIO, state=False): # x = " " - Default variable if user leaves it empty 
     self.GPIO = GPIO 
     self.state = state #Default LED state is off 
    def ledSwitch(self): 
     self.state = not self.state 
    def ledON(self): 
     self.state = True 
    def ledOFF(self): 
     self.state = False 

    def ledBlink(self, duration): 
     self.ledON() 
     print(self.ledDetails()) 
     time.sleep(duration) 
     self.ledOFF() 
     print(self.ledDetails()) 
     time.sleep(duration) 

    def ledDetails(self): 
     return "LED: " + str(self.GPIO) + " State: " + str(self.state) + '\n' 


redLED = ledController(15) 
blueLED = ledController(16, True) 


try: 
    thread.start_new_thread(redLED.ledBlink, (5,)) 
    thread.start_new_thread(blueLED.ledBlink, (2,)) 
except: 
    print "Error: unable to start thread" 

作品:hereより引用

>>> ================================ RESTART ================================ 
>>> 
>>> LED: 15 State: True 
LED: 16 State: True 
LED: 16 State: False 
LED: 15 State: False 

:ここ

threadモジュールを使用してマルチスレッドプログラムを実行する別の方法です

そして、ここにありますThreadサブクラスを使用するサンプル(di Dそれ):以下のように動作します

import threading 
import time 

exitFlag = 0 

class myThread (threading.Thread): 
    def __init__(self, threadID, name, counter): 
     threading.Thread.__init__(self) 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
    def run(self): 
     print "Starting " + self.name 
     print_time(self.name, self.counter, 5) 
     print "Exiting " + self.name 

def print_time(threadName, delay, counter): 
    while counter: 
     if exitFlag: 
      threadName.exit() 
     time.sleep(delay) 
     print "%s: %s" % (threadName, time.ctime(time.time())) 
     counter -= 1 

# Create new threads 
thread1 = myThread(1, "Thread-1", 1) 
thread2 = myThread(2, "Thread-2", 2) 

# Start new Threads 
thread1.start() 
thread2.start() 

print "Exiting Main Thread" 

Starting Thread-1 
Starting Thread-2 
Exiting Main Thread 
Thread-1: Thu Mar 21 09:10:03 2013 
Thread-1: Thu Mar 21 09:10:04 2013 
Thread-2: Thu Mar 21 09:10:04 2013 
Thread-1: Thu Mar 21 09:10:05 2013 
Thread-1: Thu Mar 21 09:10:06 2013 
Thread-2: Thu Mar 21 09:10:06 2013 
Thread-1: Thu Mar 21 09:10:07 2013 
Exiting Thread-1 
Thread-2: Thu Mar 21 09:10:08 2013 
Thread-2: Thu Mar 21 09:10:10 2013 
Thread-2: Thu Mar 21 09:10:12 2013 
Exiting Thread-2 
+0

親愛なるを実行している、コメントを残してください、私は間違って何を知ってみましょう:) – EbraHim

2

あなたはThreadから、あなたのコントローラを導出しているが、あなたは、すべてのスレッドのメソッドを使用していません。

このため、すべてのメソッドが同期して実行され、出力がどのように生成されるかが決まります。

派生クラスでrun()メソッドを作成し、.start()を使用してスレッドを開始する必要があります。 - メソッドがスレッドの活動を表す

実行():

またdocumentationを参照してください。

サブクラスでこのメソッドをオーバーライドできます。標準のrun()メソッドは、オブジェクトのコンストラクタに渡された呼び出し可能オブジェクトを、argsおよびkwargs引数からそれぞれ取得されたシーケンシャルおよびキーワード引数を使用してターゲット引数として呼び出します。

関連する問題