2016-10-03 5 views
1

현재 특정 시점부터 경과 한 시간을 표시하는 프로그램을 작성 중입니다. 원하면 스톱워치.시간이 부정확하거나 비효율적입니까?

나는 마침내 내 코드를 작동 시켰지만, 결과적으로 정확하지는 않습니다. 그것은 매우 빠르게 뒤지고, 처음 10 초 이내에 1 초 또는 2 초 밖에 떨어지지 않습니다. 이것이 왜 그렇게되는지 완전히 확신 할 수 없습니다.

# Draw 
def draw(): 
    stdscr.erase() 
    stdscr.border() 

    # Debugging 
    if debug: 
     stdscr.addstr(5 , 3, "running : %s " % running) 
     stdscr.addstr(6 , 3, "new  : %s " % new) 
     stdscr.addstr(7 , 3, "pureNew : %s " % pureNew) 
     stdscr.addstr(8 , 3, "paused : %s " % paused) 
     stdscr.addstr(9 , 3, "complete : %s " % complete) 
     stdscr.addstr(10, 3, "debug : %s " % debug) 

    if running: 
     stdscr.addstr(1, 1, ">", curses.color_pair(8)) 
     stdscr.addstr(1, 3, t.strftime("%H:%M.%S", t.gmtime(timeElapsedTotal))) 

    elif not running: 
     if new and pureNew: 
      stdscr.addstr(1, 1, ">", curses.color_pair(5)) 
      stdscr.addstr(1, 3, t.strftime("%H:%M.%S", timeNone)) 
     elif paused: 
      stdscr.addstr(1, 3, t.strftime("%H:%M.%S", t.gmtime(timeElapsedTotal)), curses.color_pair(1)) 
      stdscr.addstr(1, 1, ">", curses.color_pair(3)) 
     else: 
      stdscr.addstr(1, 1, ">", curses.color_pair(5)) 
      stdscr.addstr(1, 3, t.strftime("%H:%M.%S", timeNone)) 

    stdscr.redrawwin() 
    stdscr.refresh() 
    return 

    # Calculations 
def calc(): 
    global timeElapsedTotal 
    if running: 
     timeElapsedTotal = t.clock() - timeStart 
    return 

    # Main Loop 
while True: 
    # Get input from the user 
    kInput = stdscr.getch() 

    # If q is pressed we close the program 
    if kInput == ord('q'): 
     endProg() 

    # If d is pressed we toggle 'debug' mode 
    elif kInput == ord('d'): 
     debug = not debug 

    # If s is pressed we stop the current run 
    elif kInput == ord('s'): 
     running = False 
     new = True 

    # If spacebar is pressed and we are ready for a new run, 
    #  we start a new run 
    elif kInput == ord(' ') and new: 
     running = not running 
     new = not new 
     pureNew = False 
     timeStart = t.clock() 

    # If p is pressed and we are in the middle of a run, 
    #  we pause the run 
    elif kInput == ord('p') and not new: 
     running = not running 
     paused = not paused 
     timeStart = t.clock() - timeStart 

    calc() 
    draw() 

상기 코드는 의도 한대로 작동합니다. 지연이 time.clock()에서 오는 것인지 또는 단순히 비효율적 인 코드인지 확실하지 않습니다. 이것은 스레드를 사용해야하는 종류의 작업입니까?

나는 약간의 인터넷 검색을 수행하고 다른 사람들이 시간 모듈에서 다른 기능에 대해 이야기하는 것을 보았으나 나를 위해 더 잘된 것은 없었습니다.

정보가 충분하지 않거나 간단한 실수를 저에게 알려주세요.

+2

'time.clock '은 다른 운영 체제에서 다른 것을 의미합니다. 매우 성가 시지만, 거기에 있습니다. 리눅스에서 경과 된 실행 시간이지 벽 시계 시간이 아니며 초 계산에는 사용하면 안됩니다. – tdelaney

+0

@tdelaney 좋습니다. 좋은 대안이 있는지 아십니까? datetime 모듈을 사용하여 동일한 문제가 발생합니까? 아니면 다음 단계입니까? – Ophi

+1

이 문제를 해결하기위한보다 현대적인 방법이 있는지는 모르겠지만 리눅스에서 실행 중인지 여부를 확인하는 날에 (고해상도 벽시계는 time.time()) 또는 창 (고해상도 벽시계는 time.clock)을'platform.system()'을 통해 호출하고 거기에서 시계를 선택하십시오. – tdelaney

답변

2

time.clock()에서 time.time()으로 변경하는 것이 간단하므로 tdelaney으로 제안 된대로 간단합니다.

모듈을 사용하는 동안 모듈을 더 철저히 읽어야합니다. 지혜를 가져 주셔서 감사합니다.