2017-03-11 4 views
2

며칠 동안 문제가 발생했습니다. 나는 몇 시간 동안 전보국을 찾고 비어있는 것을 보냈다.while 루프에서 스레드를 사용하면 LED 깜박임 문제가 발생합니다.

API에서 데이터를 가져 와서 JSON으로 구문 분석하고 LCD 화면에 표시하는 프로그램이 있습니다. 데이터가 특정 조건을 충족하면 LED 표시등이 깜박이기를 원합니다. 나는 지금까지 상당히 성공적이었다. 내가 겪고있는 문제는 메인 주간 루프에서 깜박임을 시작하기 위해 스레드가 호출되고 메인 루프가 다시 시작될 때 스레드가 다시 호출 된 것처럼 보입니다. 이것은 루프가 다시 시작될 때마다 LED가 이상한 행동을하기 시작합니다. 어떤 제안?

v.isAlive() == False "를 사용하여 스레드가 다시 시작되지는 않지만 유용하지는 않습니다. 단지 조건이 충족되면 스레드를 한 번 시작하여 계속 깜박입니다. . 조건이 충족되지 않을 때까지이 LCD 화면을 사용하기 때문에 LED, 데이터는 연속 루프에

여기

내 프로그램의 매우 단순화 된 조각입니다.!

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

매번 새로운 스레드 개체가 만들어지기 때문입니다. partCloudBlink_start이 호출됩니다. v.isAlive()은 새 스레드이므로 항상 False입니다.

코드 구조에 따라 스레드 개체를 저장하기 위해 전역 변수 또는 비슷한 코드를 만들 수 있습니다.

+0

그래서 PartCloudBlink_start() 변수를 만들려고 시도한 다음 스크립트에서 해당 변수를 실행하고 완벽하게 작동했습니다. –

+0

그래서 효과가있었습니다. .. 4 ~ 5 개의 루프가 나중에 미친 듯이 행동하기 시작했습니다. 쓰래드가 계속 재시작하는 것처럼 보입니다. 결국 수백 개의 반복 스레드가 실행됩니다. –

+0

"PartCloudBlink_start"변수가 무엇인지 이해할 수 없습니다. 'partCloudBlink_start'에서 변수'v'를 봅니다. 매번 새로운 스레드가 생성되어'v'에 할당됩니다. 그래서 수백 개의 스레드가 실행됩니다. – Liteye