Xlib:GUIデジタル時計の最良の実装は何ですか?

Xlib:GUIデジタル時計の最良の実装は何ですか?

私はデジタル時計を含む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分程度の誤差を引き起こします。

代わりに、次の分までの残り時間を計算し、その時間にタイマーを設定してください。またはその時間のイベントを設定してください。

関連情報