プログラムのループの周期を設定する方法

このQ&Aのポイント
  • C/C++でプログラムを作成し、ループの周期を設定したい場合、どうすればよいでしょうか。
  • プログラム内でループの周期を指定するためには、時間計測関数を使用することが一般的です。
  • 具体的には、ループの開始時と終了時にクロック値を取得し、その差分を計算して処理時間とすることで、周期を制御することができます。
回答を見る
  • ベストアンサー

プログラムのループの周期を設定する方法

C/C++でプログラムを作成していますが,(MicroSoft Visualstadio C++6.0)で int main() { time[1000]; clock_t t1,t2; t2 = 0; for(int i = 0;i < 1000;i++) { . . Sleep(10) t1 = clock(); time[i] = t1-t2; t2 = clock(); } //エクセルでtime[]を書き出す } としてfor分の中のループ1回分の周期を10msにしようとしているのですが,time[]をエクセルで書き出すと15msになってしまいます. ループ1回分を一定の時間で処理させるにはどうしたらよいのでしょうか. ループ1回分の周期は50ms以下で実行できれば問題ありません.また誤差1ms未満であれば問題ありません(できればあまり大きくないほうがよい).上のプログラムではSleepを使ってますが別にこだわっている訳ではなくほかに方法が分からなかっただけです.できれば簡単なプログラムのようなものを付けて,分かる方はどうか教えてください.

質問者が選んだベストアンサー

  • ベストアンサー
noname#208124
noname#208124
回答No.1

timeBeginPeriod(1) をするとSleep(を含むタイマー)の精度が上がります

参考URL:
http://d.hatena.ne.jp/NyaRuRu/20060910

その他の回答 (1)

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.2

for loop 内で他のプログラム(スレッド)に制御が渡ると駄目なので 割り込み禁止状態にする必要があります。 しかしこれはアプリでは出来ないので優先順位を最上位にすればそれに近くなりますが、Windowsのプログラムとしては無理があると思います。 リアルタイムOSの領分かと。

関連するQ&A

  • 一定周期実行プログラム

    UNIX環境での、プログラムを一定周期実行させるプログラミング方法についてご教授下さい。 例えば、50msの周期で、無限ループするプログラムです。 while(1) { t1=clock(); (処理1); t2=clock(); passtime=(t2-t1)/CLOCKS_PER_SEC; time=0.05-passtime; tmp=(int)(1000000*time); usleep(tmp); } まず、思い付いたプログラムは、処理1に掛かった時間を計算し、50msから処理に掛かった時間を引いた時間をsleepで待たせるプログラムです。clock()は精度が低いようですが・・・他に何かいい方法はないでしょうか?

  • このプログラムの結果は正しいのでしょうか?

    下記のプログラムはregister変数へのアクセスが高速であることを確認するためのプログラムです #include <stdio.h> #include <time.h> int i; /* これはグローバル変数なので、 register変数には変換されない */ int main(void) { register int j; int k; clock_t start, finish; start = clock(); for(k=0; k<100; k++) for(i=0; i<32000; i++); finish = clock(); printf("レジスタを使わないループの刻み数: %ld \n", finish - start); start = clock(); for(k=0; k<100; k++) for(j=0; j<32000; j++); finish = clock(); printf("レジスタを使ったループの刻み数: %ld \n", finish - start); return 0; } 【質問】 このプログラムを実行すると、 レジスタを使わないループの刻み数: 15 レジスタを使ったループの刻み数: 0 と表示されます。 この結果はregister変数へのアクセスが高速であることの証明になるのでしょうか? また「刻み数」とは何のことですか?教えて頂けないでしょうか?

  • ループが変な動作をする

    このプログラムは表示された数値を逆に入力するプログラムです。 入力した値の正誤を表示します。結果に問わず3回で終了する ようにしたいです。 ところが、下のプログラムを動作させたところ間違いを3回入力 したら終了するという仕様になってしまっています。 何がおかしいのでしょうか? for(m=0;m<3;m++) { ---------------------------------------(省略) if(strcmp(gyakuho,nyuu)!=0) { printf("\a間違いです。\n"); } else { printf("正解です。\n"); count++; } } おそらく、間違っているのはループの中のこの部分なのでは ないかと思います。 #include<stdio.h> #include<time.h> #include<stdlib.h> #include<string.h> int sleep(unsigned long x) { clock_t c1=clock(),c2; do{ if((c2=clock())==(clock_t)-1) { return -1; } }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 0; } int main(void) { char gyaku[4]; char gyakuho[4]; int i,j,m; char nyuu[4]; int k=0; int count=0; clock_t start,end; char x; srand(time(NULL)); printf("4桁の数値を記憶しましょう。\n"); start=clock(); for(m=0;m<3;m++) { x='1'+rand()%9; gyaku[0]=x; for(i=1;i<4;i++) { do{ x='0'+rand()%10; for(j=0;j<i;j++) { if(x==gyaku[j]) { break; } } }while(j<i); gyaku[i]=x; } gyaku[4]='\0'; printf("%s",gyaku); fflush(stdout); sleep(500); printf("\r \n"); for(i=3;i>=0;i--) { gyakuho[k++]=gyaku[i]; } gyakuho[4]='\0'; printf("表示された数字を逆に入力せよ:"); scanf("%s",nyuu); if(strcmp(gyakuho,nyuu)!=0) { printf("\a間違いです。\n"); } else { printf("正解です。\n"); count++; } k=0; } end=clock(); printf("3回中%d回成功しました。\n",count); printf("%.1f秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • ダブルループ 

    ダブルループを使って 正方形の中に小さい正方形を何重にも作るっていくプログラムを 作りたいんですが for(int t=0;t<5;t++){ for(int i=0;i<4;i++){ p.drawRect(65*(i+2),65*(t+2),60,60); } } for(int t=0;t<5;t++){ for(int i=0;i<4;i++){ p.drawRect(65*(i+2),65*(t+2),50,50); } } for(int t=0;t<5;t++){ for(int i=0;i<4;i++){ p.drawRect(65*(i+2),65*(t+2),40,40); } こういう風に書くと鱗のようになってしまうんですが 綺麗に正方形の中に正方形の図を描くにはどうしたいいんでしょうか

    • ベストアンサー
    • Java
  • 二重ループのあるプログラム(C言語)

    #include <stdio.h> int main(void) { int i, j, c, c2; c = 0; for(i = 100; i < 1000; i++) { c2 = 0; for(j = 1; j <= i; j++) { if (i % j == 0) c2++; } if (c2 % 2 == 1) c++; } printf("%d個です。\n", c); return 0; } というプログラムがあるのですが、2重ループ部分のそれぞれのループに対応して、 2つの関数として独立させるとどのようになりますか? また、2つの関数のいずれにおいても、ループを用いずに再帰呼び出しを用いるとどうなりますか?

  • 4桁の英字の3桁目を当てるプログラム

    乱数でとってくる4ケタの英字の3桁目を入力して当てるプログラムを 組もうとしているのですが、コンパイラしてもいまいちうまくいきません。 特に下に書いたプログラムのこの部分が違っていると思い どのように修正したらよいのか指摘していただきたいです。 human=getchar(); if(comp[2]!=human) { ero=1; } よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> int sleep(unsigned long x) { clock_t c1=clock(),c2; do{ if((c2=clock())==(clock_t)-1) { return 0; } }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return 1; } int main(void) { int num,val,i,j; char comp[21]; char human; int ero=0; int try_count=0; int seikai=0; clock_t start,end; int num1; char eiji[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; srand(time(NULL)); puts("英字記憶トレーニング"); do{ printf("挑戦するレベル(3~20):"); scanf("%d",&num1); }while(num1<3 || num1>20); printf("%d個の英字を記録しましょう。\n",num1); start=clock(); do{ for(i=0;i<num1;i++) { comp[i]=eiji[rand()%strlen(eiji)]; } comp[num1]='\0'; printf("%s",comp); fflush(stdout); sleep(125*num1); printf("\r%*s\r3番目の英字を入力してください:",num1,""); human=getchar(); if(comp[2]!=human) { ero=1; } if(ero==0) { printf("正解です。\n"); seikai++; } else { printf("\a間違いです。\n"); } try_count++; }while(try_count<2); end=clock(); printf("%d回中%d回成功しました。\n",try_count,seikai); printf("%.1f秒でした。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • プログラムの実行を中断

    標準ライブラリにプログラムを指定した時間だけ停止する、というような関数はあるでしょうか? 自分でも似たような関数を作ったのですが、負荷が大きいらしく動作が指定した時間よりも遅れてしまうことがあります。 #include <ctime> void sleep(int time) { tm *present; time_t clock; int begin; time(&clock); present=localtime(&clock); begin=present->tm_sec while(begin!=present->tm_sec-time){ time(&clock); present=localtime(&clock); } return; }

  • 問題文に対してこのプログラムは正しいか

    文字列を先頭から1文字ずつ表示する関数を作成せよ。 void gput(const char *s, int speed); ここで、sは表示する文字列、speedはミリ秒単位の表示速度である。たとえば、 gput("ABC", 100); と呼びだすと、まず'A'を表示し、その100ミリ秒後に'B'を表示し、さらにその100ミリ秒後に'C'を表示する。このようにして"ABC"の全文字を表示すると呼び出し元に戻ること。 /* 課題2-1 */ #include <time.h> #include <stdio.h> #include <stdlib.h> /* gput関数の宣言 */ void gput(const char *s, int speed); /* sleep関数の宣言 */ int sleep(unsigned long x); int main (void) { gput("ABC", 1000); return (0); } /* gput関数の定義 */ void gput(const char *s, int speed) { int i; int c = strlen(s); for(i=0; i<c; i++){ putchar(s[i]); fflush(stdout); sleep(speed); } } /* sleep関数の定義 */ int sleep(unsigned long x) { clock_t c, s = clock(); do{ if((c = clock()) == (clock_t)-1) return (0); }while(1000UL * (c - s) / CLOCKS_PER_SEC < x); return (1); } 演習問題に解答が無いので質問します。 呼び出し元に戻ることとは、gput関数を呼び出した後にmain関数に戻ることを言っているのでしょうか。 またsleep関数では、return 0とreturn1を使い分けていますがそれぞれどういった意味があるのですか。 関数の返り値は理解できるのですが、本にmain関数のreturn0についてなど何も触れられていないので混乱しています。

  • ソートプログラム

    前に質問したものです。慌てていたのですみません。 Cで書いた直接選択法です。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 void main( void ) { int min,s,t,i,j,k,a[N]; srand((unsigned int)time(NULL)); for(i=0;i<N;i++) a[i]=rand()%1000+1; for(j=0;j<i-1;j++){ min=a[j]; s=j; for(k=j+1;k<i;k++){ if(a[k]<min){ min=a[k]; s=k; } } t=a[j];a[j]=a[s];a[s]=t; for(s=0;s<i;s++) printf("%d,\t",a[s]); } } このプログラムを実行すると、1回ずつ入れ替えされたものが出力されます。 100回、200回、・・・と入れ替えを行った値を出力するには、どうすればよいでしょうか? ループを入れてみたりしてみましたが、、?? プログラムを再帰の方法をつかって書いたほうが、、、?? よろしくお願いします。

  • なんで一瞬で処理が終わるの?

    時間を計測するプログラムを書いたのですが、何故か一瞬で処理が終わってしまいます。 #include <stdio.h> #include <time.h> int main(void){ int i,j,a,b=1; clock_t t; t=clock(); for(i=0;i<1000000000;i++){ for(j=0;j<10000000;j++){ a=b; } } printf("%.3f秒\n",(clock()-t)/1000.0); printf("%f %f",clock(),t); return 0; } 実行結果 0.000秒 0.000000 0.000000 なんで0なんでしょうか・・。

専門家に質問してみよう