C言語:指定した秒数経過後にメッセージを表示する

C言語:指定した秒数経過後にメッセージを表示する C言語

C言語で指定した秒数経過後にメッセージを表示するタイマープログラムです。
わたしの教えた学生は、メッセージを表示する部分をsystem命令に改良し、

system("alarm.wav");

などとして、好きな音を鳴らしていました。
clock()関数は、プロセッサ時間を返す関数で、プログラムの経過時間が戻り値です。
CLOCKS_PER_SECで割ってあげることで、秒数に直して使えます。

指定した経過秒数後にメッセージを表示するプログラム
/* timer.c 指定した秒数経過後に、メッセージを表示する */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

int main(void)
{
	double startTime, endTime;
	double totalTime = 0.0, setTime = 0.0;
	char message[] = "時間だよ!";

	/* 時間をセット */
	printf("何秒にセットする? ");
	scanf("%lf", &setTime);
	
	/* タイマー開始(ミリ秒単位) */
	startTime = clock() / CLOCKS_PER_SEC ;
	
	/* 待機時間チェック */
	while(1){
		if(totalTime > setTime) break;
		Sleep(100);	/* CPU負荷の軽減のため0.1秒待機 */
		endTime = clock() / CLOCKS_PER_SEC ;
		totalTime = endTime - startTime;
	}
	
	/* 終了メッセージ */
	printf("%s\n", message);
	
	/* 計測時間を表示 */
	printf("\nstartTime = %f\n", startTime);
	printf("endTime = %f\n", endTime);
	printf("totalTime = %f\n", totalTime);

	return 0;
}

CPU負荷を考慮しないひどいプログラムの場合

こちらは以前掲載していたプログラムです。
コメントでCPU負荷を考慮していないとご指摘頂いたため上記プログラムに修正しました。
while文の無限ループにSleep関数を入れていないため、CPU負荷が大きくなってしまいます。

sleep関数やSleep関数は、処理を一定時間止めるだけでなく、その間のCPUの使用権も他のプロセスにまわしてくれます。

一応、悪い例としてそのまま掲載しておきます。

/* timer.c 指定した秒数経過後に、メッセージを表示する */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
	double startTime, endTime;
	double totalTime = 0.0, setTime = 0.0;
	char message[] = "時間だよ!";

	/* 時間をセット */
	printf("何秒にセットする? ");
	scanf("%lf", &setTime);
	
	/* タイマー開始(ミリ秒単位) */
	startTime = clock() / CLOCKS_PER_SEC ;
	
	/* 待機時間チェック */
	while(1){
		if(totalTime > setTime) break;
		endTime = clock() / CLOCKS_PER_SEC ;
		totalTime = endTime - startTime;
	}
	
	/* 終了メッセージ */
	printf("%s\n", message);
	
	/* 計測時間を表示 */
	printf("\nstartTime = %f\n", startTime);
	printf("endTime = %f\n", endTime);
	printf("totalTime = %f\n", totalTime);

	return 0;
}

スポンサーリンク

コメント

  1. 匿名 より:

    こんなソースありえないですよ。。。CPU負荷とか理解されてますか?

    • shuichi より:

      匿名さんこんばんは。管理人です。
      確かに無限ループでこの処理はひどいですね。(CPUにとって!)
      もう少しましなプログラムに修正しておきました。

タイトルとURLをコピーしました