ここから本文です

現在、「ストップウォッチ」のような機能を持つプログラム(時間分解能は1[ms])...

har********さん

2012/11/717:11:00

現在、「ストップウォッチ」のような機能を持つプログラム(時間分解能は1[ms])を作成しているんですが、開始してもまったく動かない状態になります。

ソースコードは
#include <windows.h>

#include <stdio.h>
#include <conio.h>




int main(void)
{
int command;//キーボード入力の文字判別用変数
int quit_flag = 1;//プログラム終了フラグ 0で停止
int c_flag = 0;//カウント状態取得用フラグ 1:カウント中,0:停止中
int h,m,s,ms;//左から,時間,分,秒,ミリ秒


printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n");
printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n");
printf("使い方:qでプログラム終了\n\n");

h=m=s=ms=0;

while(quit_flag != 0)//quit_flagが0以外ならループ
{
while(!_kbhit())//何かキーが押されるまでループ
{
if(c_flag != 0)//c_flagが0以外であればカウント中ということ.
{
}
printf("%02d:%02d:%02d:%03d\r",h,m,s,ms);
}
command=_getch();//ループを抜けるために押されたキーの内容をcommandに代入.
if(command=='s' && c_flag == 0)
{
printf("\n計測開始\n");
c_flag = 1;
}
else if(command=='s')
{
printf("\n計測中止\n");
c_flag = 0;
}
else if(command=='r')
{
printf("\nカウンタリセット,停止\n");
c_flag = 0;
h=m=s=ms=0;
}
else if(command=='q')
{
printf("\n終了\n");
quit_flag = 0;
}
}

return 0;
}

です。
おかしなところまたは、適宣追加していただけるとありがたいです。

閲覧数:
1,361
回答数:
2

違反報告

ベストアンサーに選ばれた回答

lun********さん

2012/11/718:18:22

多分こんな感じでいかがでしょうか?

int h,m,s,ms;//左から,時間,分,秒,ミリ秒
->
unsigned long now, start;

h=m=s=ms=0;
->
now = 0;

if(c_flag != 0)//c_flagが0以外であればカウント中ということ.
{
}
printf("%02d:%02d:%02d:%03d\r",h,m,s,ms);
->
if(c_flag != 0)//c_flagが0以外であればカウント中ということ.
{
now = GetTickCount() - start;
}
printf("%02d:%02d:%02d:%03d\r",now / 3600000,(now / 600000) % 60,(now / 1000) % 60,now % 1000);

printf("\n計測開始\n");
c_flag = 1;
=>
printf("\n計測開始\n");
c_flag = 1;
start = GetTickCount();
now = 0;

printf("\nカウンタリセット,停止\n");
c_flag = 0;
h=m=s=ms=0;
=>
printf("\nカウンタリセット,停止\n");
c_flag = 0;
//h=m=s=ms=0;
now = 0;

多分,ミリ秒は,33m秒単位か16m秒単位だと思いますが...
1m秒単位で正確な値が必要なら,ボードが必要かも知れません

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

iss********さん

2012/11/1004:20:12

>luna_khan2002さん
かなり以前からWindowsマシンのハードウェア時間分解能は数10~数100nsecになっていますので、外付けボードは必要ありません。
(DOS時代の8086マシンでもちょっとタイマー割り込みをいじって1mSの分解能を得ることはしばしば行われていました)

「結論:正確な時間計測には QueryPerformanceCounter(), QueryPerformanceFrequency() を使いなさいってこった。」だそうです。
http://mcn.oops.jp/wiki/index.php?Develop%2FTimer#m6b96ff7

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる