2016-07-26 3 views
3

저는 프로그래밍에 익숙하지 않고 매 2 초마다 점수에서 1을 뺀 카운터를 추가하고 싶습니다. 코드가 지저분한 경우타이머는 파이썬에서 스레딩하지 않습니까?

chr 
import random 
import time 
radians2 = None 
ans = None 
score = 0 

radians1 = ['0', 'π/6', 'π/3', 'π/4', 'π/2', '2π/3', '3π/4', '5π/6', 'π', '7π/6', '4π/3', '5π/4', '3π/2', '5π/3', '7π/4', '11π/6', '2π'] 
while radians2 == ans or ans == None: 

radians3 = (random.choice(radians1)) 
ans = input(radians3) 
if radians3 == '0': 
    radians2 = 0 

elif radians3 == 'π/6': 
    radians2 = 30 

elif radians3 == 'π/3': 
    radians2 = 60 

elif radians3 == 'π/4': 
    radians2 = 45 

elif radians3 == 'π/2': 
    radians2 = 90 

elif radians3 == '2π/3': 
    radians2 = 120 

elif radians3 == '3π/4': 
    radians2 = 135 

elif radians3 == '5π/6': 
    radians2 = 150 

elif radians3 == 'π': 
    radians2 = 180 

elif radians3 == '7π/6': 
    radians2 = 210 

elif radians3 == '4π/3': 
    radians2 = 240 

elif radians3 == '5π/4': 
    radians2 = 225 

elif radians3 == '3π/2': 
    radians2 = 270 

elif radians3 == '5π/3': 
    radians2 = 300 

elif radians3 == '7π/4': 
    radians2 = 315 

elif radians3 == '11π/6': 
    radians2 = 330 

elif radians3 == '2π': 
    radians2 = 360 
score = score + 1 

if radians2 == ans: 
    print('Correct!') 
    print "You've got %d in a row" % score 
print "You lose, the correct answer was %d" % radians2 

죄송합니다 (그래서 난 내 점수 상승을 신속하게 대답 할 필요)/ 긴 나는 기본적으로 같은 것을 실행하려는 것을 알아 냈 :

while 1: 
    time.sleep(2) 
    score = score - 1 

을 유일한 문제는 나머지 프로그램과 동시에 실행되지 않을 것이고 스레딩 (대안 인 것으로 보이는)이 나에게 매우 혼란 스럽다는 것입니다.

+1

"동시에"는 스레딩이 필요하다는 의미입니다. 그리고 예, 스레딩은 혼란 스러울 수 있지만, 스레딩은 혼란 스럽습니다. –

+0

스레딩의 대안 - 메인 루프 -는 아마도 훨씬 더 혼란 스럽습니다. 스레딩은 그다지 어렵지 않습니다. –

+4

음, 사용자에게 묻기 전에 시간 ('time.clock()'또는'datetime.datetime.now()')을 측정 할 수 없습니까? 차이점은 답변을 얻는 데 걸린 시간이므로 스레드 또는 루프가 필요하지 않습니다. –

답변

1

다음 코드를 사용하여 새 스레드를 시작하고 run() 메소드에 함수 논리를 씁니다. 스레드 (self.runable = TRUE)까지 실행 가능하다

import threading 
import time 

class RepeatEvery(threading.Thread): 
    def __init__(self, interval): 

     threading.Thread.__init__(self)  
     self.interval = interval # seconds between calls 
     self.runable = True 

    def run(self): 
     global score # make score global for this thread context 
     while self.runable: 
      time.sleep(self.interval) 
      if self.runable:  
       score = score - 1 
       self.runable = False 

    def stop(self): 
     self.runable = False 

상기 코드가 반복되므로, 2 초 파괴 할 실행 방법 1 내부 루프에 의해 감소한다 점수 후, 및 종료한다.

위의 스레드를 호출하려면 이렇게하십시오.

score_thread = RepeatEvery(2) 
score_thread.start()  

스레드 생성자에게 초기화를 호출 2 초 여기에서 전달 된 어떤 값으로 간격 변수를 초기화합니다.

그 사이에 스레드를 중지하려면 stop() 메소드를 호출하십시오.

score_thread.stop() 

join() 메서드를 호출하여 스레드가 스레드를 완료 할 때까지 대기 할 수 있습니다.

score_thread.join() 

하지가 혼란 :) 당신이 어떤 스레드, 당신이 경과 된 시간을 산출 할 것이다 발전기의 다음 메소드를 호출 할 때마다 사용하려는 해달라고하면

+0

스레드를 호출하려고하면 RepeatEvery가 정의되지 않는다고 표시됩니다. 코드에서 어디에서 시작 라인을 배치해야할지 모르겠습니다. – Warstolrem

+0

방금 ​​대답을 편집했습니다 –

+0

여전히 날 문제가 발생, 내가 모듈을 실종 (내가 스레딩있다)하고 RepeatEvery 정의되지 않았습니다 말합니다 – Warstolrem

1

당신은 corutine을 사용할 수 있습니다 보이는합니까 :

def timer(): 
    prev_time = new_time = 0 
    while True: 
     prev_time, new_time = new_time, time.clock() 
     time_delta = new_time - prev_time 
     yield time_delta 

>>> t = timer() 
>>> t.next() 
4.399568842253459e-06 
>>> t.next() 
1.7571719571481994 
>>> t.next() 
0.8449679931366727 
관련 문제