Estou fazendo um aplicativo X que contém um relógio digital. O relógio exibe a hora atual no formato "hh:mm". Eu quero dominar o Xlib, então quero usar apenas o Xlib (nenhum outro kit de ferramentas).
O relógio tem que atualizar uma vez por minuto. Para refrescar o relógio, criei três implementações, mas não posso julgar qual é a melhor. Por favor me diga qual é o melhor. E, se houver outras implementações melhores, por favor me diga.
A primeira implementação atualiza o relógio de dentro do loop de eventos. A segunda e terceira implementações atualizam o relógio de fora do loop de eventos.
A primeira implementação é a seguinte: no loop de eventos, utilizo XEventsQueued ou XPending para saber o número de eventos restantes. Se não houver eventos, verifique a hora atual e, se 1 minuto ou mais se passou desde a última atualização, atualizo o relógio. Se restarem alguns eventos, eu processo outros eventos de janela.
A segunda implementação é a seguinte: eu uso settimer com intervalo de 1 minuto. O manipulador de sinal captura SIGALRM e atualiza o relógio.
A terceira implementação é a seguinte: Eu uso pthread. A função thread atualiza o relógio e dorme 1 minuto e faz a mesma coisa para sempre.
A primeira implementação é a mais simples. Mas temo que ele repita frequentemente o loop de eventos e consuma a energia da CPU.
Todos os métodos que dormem por 1 minuto, irão se deslocar, pois você faz outras operações, o loop vai demorar um pouco mais de 1 minuto.
Apenas esperando um minuto, fará com que o relógio marque em um tempo arbitrário dentro do minuto. Isso resultará em um relógio com até um minuto de atraso.
Em vez disso, calcule quanto tempo falta para o próximo minuto e defina um cronômetro para esse tempo. Ou defina um evento para esse horário.
Isso falhará nos raros casos em que não houver eventos por 1 minuto.
Perfeitamente bem.
Perfeitamente bem.