sleep (1)은 프로그램이 1 초 동안 "절전"하도록 지시합니다. 이것은 사실 매우 중요합니다. 왜냐하면 while 루프 (항상 true)가 매초마다 한 번만 실행되기 때문입니다. sleep (1) 라인을 없애면 while 루프가 절대로 휴식을 취하지 않고 컴퓨터가 무한정 빨리 진행될 수 있음을 의미합니다. 시도 할 수있는 한 가지 방법은 수면 (1)을 약간 더 작은 값으로 줄이는 것입니다. 예를 들어 sleep (0.1)을 지정할 수 있습니다.
잠자기 시간을 줄이면 시계가 더 자주 업데이트됩니다. 지금 잠을 잘 때마다 (1) 시계가 1 초에 한 번씩 업데이트되어 완벽한 의미를 갖습니다. 그러나 수면 (0.1)으로 초마다 10 번 시계를 업데이트하여 정확도를 높일 수 있습니다. 이 모든 것이 의미가있는 경우 알려주십시오.
깜박임은 프로그램이 여러 번 디스플레이를 지우고 다시 채우는 것이 원인 일 수 있습니다.
편집 : 문서() 함수가 유효 수면에 진수 값을 보내는 것을 제안
편집 2 : 전용 화면을 새로하는 방법에 대한 여분의 비트 경우 두 번째
from datetime import datetime
from time import sleep, mktime
dti = mktime(datetime.now().timetuple())
while 1:
ndti = mktime(datetime.now().timetuple())
if dti < ndti:
dti = ndti
lcd.clear()
lcd.message(datetime.now().strftime('%b %d %H:%M:%S\n'))
sleep(0.95)
else:
sleep(0.01)
의 차례에서 바로
본질적으로 작동 원리는 다음과 같습니다.
프로그램을 시작할 때 정수 형식 (Google dti
)으로 날짜 시간을 만듭니다. "정수 형식"이란 임의의 시작 날짜 (예 : 1970-01-01 00:00:00
)에서 모든 초를 더하고 시간의 참조로 사용하는 것을 의미합니다. 예를 들어 오늘 (2016-08-18 00:00:00)은 1970 년 이후 1471478400 초와 비슷할 수 있습니다. 그 가치가 생기면 루프가 시작됩니다.
루프의 시작 부분에서 루프를 마지막으로 실행 한 이후로 현재 위치를 추적하기 위해 항상 새로운 datetime 정수 (ndti
)를 만듭니다. 이 정보를 편리하게 사용하여 if
조건부로 넘어갑니다. if
새로운 날짜/시간 정수 (ndti
)가 이전의 datetime 정수 (dti
)와 비교하여 1 초 완전히 변경되었다는 것은 분명히 1 초가 지난 것입니다. 그 이후로 이제 datetime에 참조 시간 문자열 정수를 설정합니다 (dti = ndti
). 그런 다음 메시지 (lcd.clear()
및 lcd.message()
)를 표시합니다. 그 후 우리는 1 초 미만의 시간 동안 프로그램을 잠자 게됩니다 (sleep(0.95)
). 어떤 컴퓨터는 정확히 할당 된 시간보다 더 잠을 잘 수 있기 때문에 쿠폰의 정확도가 0.05 초가됩니다. if
조건부로 실행 중이며 아직 2 초가 지나지 않은 경우 잠시 후 잠자기 후 잠시 기다려야합니다 (sleep(0.01)
).
모든 것이 정확하게 계획대로 진행된다면 매 초마다 프로그램이 LCD 화면을 한 번만 새로 고쳐야하며 그 중 약 95 %가 잠자기 상태 여야하므로 우리 바퀴가 돌지 않습니다. 그럴 이유가 없어. 또 다른 부분은 우리의 else
절이 프로그램에 0.01 초 동안 잠자기 상태를 알려주기 때문에 대부분의 경우 시계가 0.01 초의 오차로 정확하지 않을 수 있다는 것을 의미합니다. 이것은 인간이 거의 탐지 할 수 없을만큼 충분히 낮습니다. 이 모든 것이 의미가있는 경우 알려주십시오.
나는 (단순 인쇄 문을 가진 LCD 물건을 대체) 명령 줄을 통해 이것을 테스트는 (
http://time.is/)
그것을 밖으로 시도하고 당신을 위해 작동하는지 다른 시간 추적 자원과 정확히 줄 듯 .
아, 고맙습니다, 지금 무슨 일이 벌어지고 있는지 봅니다. 수면을 줄이는 것이 도움이되었지만 지연을 근절하지 못했고 '깜박임'도 증가했습니다. 거기에 시간을 '인쇄'하고 다음 새로 고침에 의존하지 않고 시계를 표시하는 방법이 있습니까? – David
디스플레이의 재생 빈도로 시간 업데이트를 편안하게 정렬 할 수있는 방법이 있는지 하드웨어를 살펴 보는 것이 좋습니다. @David –
1 초 틱을 조절하는 방법은 여기에서 확인하십시오. http://stackoverflow.com/questions/38874597/how-to-make-proper-server-tick-with-python/38874657#38874657 –