C++
 Computer >> コンピューター >  >> プログラミング >> C++

システムコールを使ったC++タイマーの作成方法

本記事では、システムコールを利用してC++でタイマー(ストップウォッチ)を作成する方法を解説します。グラフィックスやアニメーションライブラリは一切使わず、標準的なシステムコールだけで動作するシンプルな実装です。ここでいう「タイマー」とは、時間を0からカウントアップしていくストップウォッチ形式のものを指します。

使用するシステムコール

このプログラムでは、以下の2つのシステムコール(関数)を使用します。

  • sleep(n) … プログラムの実行をn秒間一時停止(スリープ)させます。1秒ごとに表示を更新するために利用します。
  • system() … 引数として渡した文字列をシステムコマンドとして実行します。ここでは画面をクリアするために使います。

サンプルコード

#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
using namespace std;

int hrs = 0;
int mins = 0;
int sec = 0;

void showClk() {
    system("cls");
    cout << setfill(' ') << setw(55) << " TIMER \n";
    cout << setfill(' ') << setw(66) << " --------------------------------------\n";
    cout << setfill(' ') << setw(29);
    cout << "| " << setfill('0') << setw(2) << hrs << " Hours | ";
    cout << setfill('0') << setw(2) << mins << " Minutes | ";
    cout << setfill('0') << setw(2) << sec << " Seconds |" << endl;
    cout << setfill(' ') << setw(66) << " --------------------------------------\n";
}

void systemCallTimer() {
    while (true) {
        showClk();
        sleep(1);
        sec++;
        if (sec == 60) {
            mins++;
            if (mins == 60) {
                hrs++;
                mins = 0;
            }
            sec = 0;
        }
    }
}

int main() {
    systemCallTimer();
}

コードの解説

1. 表示を担当するshowClk()関数

showClk()関数は、まずsystem("cls")でコンソール画面をクリアし、その後にヘッダのsetw()setfill()を使って、見やすい整形された形式で時・分・秒を表示します。setfill('0')により、例えば5秒は「05」のようにゼロ埋めされて表示される点がポイントです。

2. カウントアップ処理を行うsystemCallTimer()関数

無限ループの中で、以下の処理を繰り返します。

  1. showClk()を呼び出して現在の時刻を表示
  2. sleep(1)で1秒間待機
  3. 秒数(sec)を1増加
  4. secが60になったら分(mins)を1増やしてsecを0にリセット
  5. さらにminsが60になったら時間(hrs)を1増やしてminsを0にリセット

これにより、通常のストップウォッチと同じように、秒→分→時間と桁上がりしながらカウントアップが続きます。

実行方法と注意点

main関数からsystemCallTimer()を呼び出すだけでタイマーが起動し、プログラムを終了するまで(Ctrl+Cなどで中断するまで)永続的に動作し続けます。

なお、system("cls")はWindowsのコマンドプロンプト用の画面クリアコマンドです。LinuxやmacOSなどのUNIX系環境で実行する場合は、system("clear")に置き換えてください。また、sleep()<unistd.h>に定義されているため、Windows環境ではSleep(1000)(ミリ秒単位・<windows.h>が必要)を使うか、互換レイヤーを利用するとよいでしょう。

まとめ

このように、sleep()による一定間隔の待機とsystem()による画面クリアを組み合わせるだけで、追加ライブラリ不要のシンプルなストップウォッチ型タイマーをC++で実装できます。コンソールアプリケーションの学習教材としても最適な題材ですので、ぜひ自分で改造しながら試してみてください。

  1. C++でコンソール画面をクリアする方法をわかりやすく解説

    C++のプログラムからコンソール(ターミナル)画面に表示された内容を消去したい場合、system()関数を使ってOSのコマンドを実行するのが一般的な方法です。この関数は標準ライブラリ<cstdlib>で定義されており、引数として渡した文字列をシェルコマンドとして実行してくれます。クリアに使うコマンドはOSによって異なります。Linux / macOS:POSIX環境で動作する「clear」コマンドを使用Windows:コマンドプロンプト用の「cls」コマンドを使用Linuxでコンソールをクリアするサンプルコード以下は、Linux環境で「clear」コマンドをsystem()関数に渡

  2. C#のタイマー(System.Timers.Timer)の使い方!定期イベント処理の基本とサンプルコード

    C#で一定時間ごとに処理を繰り返し実行したい場合、「System.Timers」名前空間のTimerクラスを使用します。この記事では、Timerクラスの基本的な使い方から、実際のコード例までわかりやすく解説します。 System.Timers.Timerとは? System.Timers名前空間に含まれるTimerクラスは、指定した間隔(インターバル)が経過した後にイベントを発生させる仕組みを持っています。単発のイベントだけでなく、AutoResetプロパティを設定することで、定期的なイベントを繰り返し発生させることも可能です。バックグラウンドでの定期処理や、監視処理などに幅広く活用できます