私はデジタル時計を含むXアプリケーションを作成しています。時計は「hh:mm」形式で現在の時刻を表示します。 Xlibをマスターしたいので、Xlibだけを使いたいです(他のツールキットは使用しません)。
時計は1分ごとに更新する必要があります。私は時計を更新するために3つの実装方法を考えましたが、どちらが最善かわかりません。どちらが一番良いのか教えてください。そして他のより良い実装があれば教えてください。
最初の実装は、イベントループ内でクロックを更新します。 2番目と3番目の実装は、イベントループの外側でクロックを更新します。
最初の実装は次のとおりです。イベントループでは、XEventsQueuedまたはXPendingを使用して、残りのイベント数を把握します。それでもイベントがない場合は、現在時刻を確認し、最後の更新から1分以上経過すると、時計を更新します。イベントがさらにある場合は、別のウィンドウイベントを処理します。
2番目の実装は次のとおりです。 1分間隔でsetitimerを使用します。シグナルハンドラはSIGALRMをキャプチャし、時計をリフレッシュします。
3番目の実装は次のとおりです。私はpthreadを使います。スレッド関数は時計を更新し、1分間休止状態を維持し、永久に同じことを行います。
最初の実装が最も簡単です。しかし、イベントループを頻繁に繰り返してCPUパワーを消費するかと心配です。
答え1
最初の実装は次のとおりです。イベントループでは、XEventsQueuedまたはXPendingを使用して、残りのイベント数を把握します。それでもイベントがない場合は、現在時刻を確認し、最後の更新から1分以上経過すると、時計を更新します。イベントがさらにある場合は、別のウィンドウイベントを処理します。
まれに、1分間イベントがないため、この操作は失敗します。
2番目の実装は次のとおりです。 1分間隔でsetitimerを使用します。シグナルハンドラはSIGALRMをキャプチャし、時計をリフレッシュします。
完全に大丈夫です。
3番目の実装は次のとおりです。私はpthreadを使います。スレッド関数は時計を更新し、1分間休止状態を維持し、永久に同じことを行います。
完全に大丈夫です。
答え2
すべてのSleep 1分メソッドは他の操作を実行し、ループが1分より少しかかるため、ドリフトされます。
1分待つと、1分以内にいつでも時計がカチカチとなります。これにより、時計が最大1分程度の誤差を引き起こします。
代わりに、次の分までの残り時間を計算し、その時間にタイマーを設定してください。またはその時間のイベントを設定してください。