저는 디지털 시계가 포함된 X 응용 프로그램을 만들고 있습니다. 시계는 "hh:mm" 형식으로 현재 시간을 표시합니다. Xlib를 마스터하고 싶기 때문에 Xlib만 사용하고 싶습니다(다른 툴킷은 사용하지 않음).
시계는 1분마다 새로 고쳐져야 합니다. 시계를 새로 고치기 위해 세 가지 구현 방법을 생각해 냈는데 어느 것이 가장 좋은지 알 수 없습니다. 어느 것이 가장 좋은지 알려주세요. 그리고 다른 더 나은 구현이 있으면 알려 주시기 바랍니다.
첫 번째 구현은 이벤트 루프 내부에서 시계를 새로 고칩니다. 두 번째 및 세 번째 구현은 이벤트 루프 외부에서 시계를 새로 고칩니다.
첫 번째 구현은 다음과 같습니다. 이벤트 루프에서는 XEventsQueued 또는 XPending을 사용하여 남은 이벤트 수를 파악합니다. 여전히 이벤트가 없으면 현재 시간을 확인하고 마지막 새로 고침 이후 1분 이상 경과하면 시계를 새로 고칩니다. 이벤트가 더 있으면 다른 창 이벤트를 처리합니다.
두 번째 구현은 다음과 같습니다. 1분 간격으로 setitimer를 사용합니다. 신호 처리기는 SIGALRM을 포착하고 시계를 새로 고칩니다.
세 번째 구현은 다음과 같습니다. 저는 pthread를 사용합니다. 스레드 함수는 시계를 새로 고치고 1분 동안 휴면 상태를 유지하며 영원히 동일한 작업을 수행합니다.
첫 번째 구현이 가장 간단합니다. 하지만 이벤트 루프를 자주 반복해서 CPU 파워를 소모하게 될까봐 걱정됩니다.
답변1
첫 번째 구현은 다음과 같습니다. 이벤트 루프에서는 XEventsQueued 또는 XPending을 사용하여 남은 이벤트 수를 파악합니다. 여전히 이벤트가 없으면 현재 시간을 확인하고 마지막 새로 고침 이후 1분 이상 경과하면 시계를 새로 고칩니다. 이벤트가 더 있으면 다른 창 이벤트를 처리합니다.
드문 경우지만 1분 동안 이벤트가 없기 때문에 이 작업이 실패합니다.
두 번째 구현은 다음과 같습니다. 1분 간격으로 setitimer를 사용합니다. 신호 처리기는 SIGALRM을 포착하고 시계를 새로 고칩니다.
완전히 괜찮아요.
세 번째 구현은 다음과 같습니다. 저는 pthread를 사용합니다. 스레드 함수는 시계를 새로 고치고 1분 동안 휴면 상태를 유지하며 영원히 동일한 작업을 수행합니다.
완전히 괜찮아요.
답변2
모든 Sleep 1분 방법은 다른 작업을 수행하고 루프가 1분보다 조금 더 걸리기 때문에 드리프트됩니다.
1분만 기다리면 1분 내 언제든지 시계가 똑딱거립니다. 이로 인해 시계가 최대 1분 정도 오차가 발생합니다.
대신 다음 분까지 남은 시간을 계산하고 해당 시간에 타이머를 설정하세요. 또는 해당 시간에 대한 이벤트를 설정하세요.