C言語関係掲示板

過去ログ

No.109.現在時刻をミリ秒まで取得する


No.611

時間取得について
投稿者---kuroneko(2001/11/29 02:11:38)


kuronekoです、こんばんわ。

現在の時間を、ミリ秒まで取得したいのですが
秒までの取得方法しか分かりません。
どなたか、ミリ秒まで取得できる方法をご存知の
方がいらっしゃれば教えて頂きたいのですが。

ちなみにOSは、UNIX(HP-UX)です。

よろしくお願い致します。


No.612

Re:時間取得について
投稿者---ともじ(2001/11/29 10:39:04)


kuronekoさん、おはようございます。

>現在の時間を、ミリ秒まで取得したいのですが
>秒までの取得方法しか分かりません。

プログラム実行開始からの経過時間(プロセッサ時間)を取得する
CLOCKという関数はありますが、それではだめですか。

No.615

Re:時間取得について
投稿者---kuroneko(2001/11/30 09:41:30)


おはようございます、kuronekoです。
ともじさん、レスが遅くなりましてすみません。

ご返答ありがとうございます。
clock()で取得した時間を、CLOCKS_PER_SECで割れば
ミリ秒が取得できるということですね。

ちなみに、この関数は他のOS(例えば、Winや他のUNIX)でも
存在する関数なのでしょうか?

質問の方向がズレてしまい、申し分けありませんが
よろしくお願い致します。

No.616

Re:時間取得について
投稿者---kikk(2001/11/30 11:09:43)


ども。


>clock()で取得した時間を、CLOCKS_PER_SECで割れば
>ミリ秒が取得できるということですね。

CLOCKS_PER_SECで割った値はミリ秒ではなく秒です。CLOCKS_PER_SECが1000
の場合に、そのままの値がミリ秒になります。

>ちなみに、この関数は他のOS(例えば、Winや他のUNIX)でも
>存在する関数なのでしょうか?

標準関数なので存在はします。ただし、ミリ秒単位で取得できるかどうかは
わかりません。最近の処理系なら多分できますが、できない例としてLSI-C
があります。CLOCKS_PER_SECはその名の通り、秒あたりのクロックを表して
います。また、この定数の逆数が最小単位(秒)になります。CLOCKS_PER_SEC
が1000なら、逆数は1/1000s=0.001s=1msです。実際にいくつになっているか
は、その処理系のtime.hを調べてみてください。

おそらく、この定数は処理系が実現可能なクロックとは独立に(clock()の
粒度とは独立に)、clock()の返り値を秒に変換するために用意されて
います。

ちなみに、Windowsでのclock()の精度(粒度だったかも)は10ms以下程度
だったと思います。

ところで、最初の質問はミリ単位の時間取得ということでしたが、この関数
で用が足りたのでしょうか?
# 時刻じゃなくて時間でOK??


では。

No.619

Re:時間取得について
投稿者---kuroneko(2001/11/30 19:40:32)


kuronekoです。
みなさん、ご指摘ありがとうございます。

>ところで、最初の質問はミリ単位の時間取得ということでしたが、この関数
>で用が足りたのでしょうか?
># 時刻じゃなくて時間でOK??

プログラムの最初方で取得しようしているのですが、(プログラムの起動時間)
を流石にミリ秒は取れていません。
B.Smithさんのおしゃった「プログラム起動からの経過時間」が、ミリ秒も
ないのかな?というように考えています。

欲しい時間の情報としては、年、月、日、時、分、秒、ミリ秒です。
ミリ秒以外はlocaltime()で取得できたのを確認できたのですが・・・
他の方法は、多分無いですよね。
知識が乏しくて申し分けありません。

No.620

Re:時間取得について
投稿者---B.Smith(2001/12/01 16:25:38)


どうも。B.Smithです。
確かに標準ライブラリの時間関数では、現在の時刻に関するミリ秒を取得することは難しいかもしれませんね。
もし、急を要するのであれば、WindowsではAPIを使用すれば解決できるかもしれません。あくまでもWindows版だけですけど。

例.
#include <windows.h>
#include <stdio.h>

void main(void )
{
	SYSTEMTIME		stime;
	static char		*Week[] = {
		"Sun","Mon","Tue","Wed","Thu","Fri","Sat"
	};

	GetLocalTime(&stime);	/* 現在のローカル日時を得る */
	printf("%d/%d/%d  %s  %d:%d:%d:%d\n",
		stime.wYear,			/* 年 */
		stime.wMonth,			/* 月 */
		stime.wDay,				/* 日 */
		Week[stime.wDayOfWeek],	/* 曜日 */
		stime.wHour,			/* 時 */
		stime.wMinute,			/* 分 */
		stime.wSecond,			/* 秒 */
		stime.wMilliseconds);	/* ミリ秒 */
}



No.621

Re:時間取得について
投稿者---kikk(2001/12/03 16:38:44)


ども。


ちょっと調べたところ、gettimeofday()というのがあるようです。
HP-UXにあるかはわかりませんが。。動作はtime()に似ていますが、
マイクロ秒(μs, us)まで取得できるようです。詳細はmanを参照
してみてください(あれば)。


では。

No.624

Re:時間取得について
投稿者---kuroneko(2001/12/05 09:56:41)


kuronekoです、レスが大変遅くなりましてすみません。

>ちょっと調べたところ、gettimeofday()というのがあるようです。
>HP-UXにあるかはわかりませんが。。動作はtime()に似ていますが、
>マイクロ秒(μs, us)まで取得できるようです。詳細はmanを参照
>してみてください(あれば)。
調べたところ、gettimeofday()はHP-UXではありませんでした。

ちょっと思ったのですが、time()で秒を取得して、その秒を1000で割れば
ミリ秒を取得することは可能なのかな?
これでは駄目でしょうかね?

よろしくお願い致します。

No.628

Re:時間取得について
投稿者---ともじ(2001/12/05 13:18:48)


こんにちは。

>ちょっと思ったのですが、time()で秒を取得して、その秒を1000で割れば
>ミリ秒を取得することは可能なのかな?
>これでは駄目でしょうかね?

time関数の戻り値、time_t は一般に typedef long ですね。

No.637

Re:時間取得について
投稿者---kuroneko(2001/12/05 23:35:41)


kuronekoです。

ともじさん、ご指摘ありがとうございます。
time()ではなく、localtime()でしたね。
localtime()で得た秒を、1000で割ってもミリ秒ですよね?

よろしくお願いします。
No.641

Re:時間取得について
投稿者---B.Smith(2001/12/06 16:08:38)


>localtime()で得た秒を、1000で割ってもミリ秒ですよね?

1[Sec] = 1000[ms]なので、秒を1000倍するとミリ秒になりますね。
そういう意味では?

HP-UXで関数ftimeは使用できますか?UNIXでは使用できた、とか聞いたんですけど。
この関数はミリ秒まで取得できますが、MS-Cでは最も近い1/100秒に切り上げられてしまうため、あまり気にかけていませんでした。
もしHP-UXで使用できれば今回の問題解決に近づけるかもしれません。


No.647

Re:時間取得について
投稿者---kuroneko(2001/12/07 00:58:18)


kuronekoです。こんばんわ。
>HP-UXで関数ftimeは使用できますか?UNIXでは使用できた、とか聞いたんですけど。
>この関数はミリ秒まで取得できますが、MS-Cでは最も近い1/100秒に切り上げられてしまうため、あまり気にかけていませんでした。
>もしHP-UXで使用できれば今回の問題解決に近づけるかもしれません。
ftime()って、Win上だけでANSIには無いという認識でいました。
もしかしたら、HP-UXではないかもしれません。
(HP-UXのバージョンが古ければ、あったかもしれませんが・・・)
はっきりとした答えではありませんで、調べてみたいと思います。

ともじさん、おっしゃる通りです。
考えが甘かったです、ご指摘ありがとうございます。


No.649

Re:時間取得について
投稿者---kuroneko(2001/12/07 09:39:55)


kuronekoです。おはようございます。

>HP-UXで関数ftimeは使用できますか?UNIXでは使用できた、とか聞いたんですけど。
manコマンド調べたところ、ftime()(sys/timeb.h)がありました。

さっそく試してみたいと思います。
ありがとうございます。

No.642

Re:時間取得について
投稿者---ともじ(2001/12/06 20:03:50)


kuronekoさん、こんばんは。

>time()ではなく、localtime()でしたね。
>localtime()で得た秒を、1000で割ってもミリ秒ですよね?

localtime()で取得する秒は、int型なので、やっぱり無理
だと思いますけど。
例えば、17秒を1000で割ると、0.017ですけど、1秒間は0.017に
なりますよね。これではミリ秒単位というのとは違いますよね。

No.617

Re:時間取得について
投稿者---B.Smith(2001/11/30 11:37:03)


> clock()で取得した時間を、CLOCKS_PER_SECで割れば
> ミリ秒が取得できるということですね。

単なる入力ミスだと思うのですけど、念のため。
clock()の戻り値をCLOCKS_PER_SECで割れば、秒が取得できますね。

MicrosoftのCに限れば、time.hの中でCLOCKS_PER_SECは1000と定義されています。
CLOCKS_PER_SECで割れば秒の近似値が取得できる、ということですから、関数clockの戻り値そのものが、今必要とされているミリ秒ですね。
この関数で得られる時間は「現在の時刻」に対してではなく、「プログラム起動からの経過時間」ですのでご注意ください。

関数clockはWindows、UNIXで問題なく使用できます。
ちなみに、移植性を考慮しなければ、WindowsではAPI関数GetTickCount()を工夫して、似たような処理をすることが可能です(戻り値はミリ秒で、Windows起動からの経過時間を示す)。

定数CLOCKS_PER_SECは、昔のCではCLK_TCKと表現されていました。
古いコンパイラだとCLK_TCKが使われている場合があるので注意してください。



戻る


「初心者のためのポイント学習C言語」 Last modified:2002.01.11
Copyright(c) 2000-2002 TOMOJI All Rights Reserved