usleep 代替案

ネタです。


あくまで、個人的に出来ただけなので、信用しないで下さい。備忘録で書いているだけです。責任はもてません。
初めは、usleep代替関数を目指していますが、途中から、適度な細切れ寝ができるようにしたいというほうに、ねじ曲がっているので注意が必要です。

それでもいいという方は、続きを読むを押して下さい。




Windowsでも、usleepが使いたい!
というわけで、色々調べてたら、下記の記述が出てきました。( ´ ▽ ` )ノ

QueryPerformanceCounterというのは、すごい精度のカウンターのようです。。

どこかの人が、悩んでいるコードなので、完全版ではないですが。。


http://www.gidforums.com/t-14836.html

int usleep (unsigned int us) {

  LARGE_INTEGER start, end, d;
  QueryPerformanceCounter(&start);								//Get the start interval
  d.QuadPart = g_ptFreq.QuadPart * ((double)us / 1000000.0);	//Caculate the total number of tics are equivalent to (us) microseconds


  do {
    QueryPerformanceCounter(&end);								//Get the end interval
  } while (end.QuadPart - start.QuadPart < d.QuadPart);			//Check if the end is older
  
  return 0;

}


正確には、これだけでは、だめで、修正したのが、したのやつです。

int usleep (unsigned int us) {

  LARGE_INTEGER start, end, d;
  QueryPerformanceCounter(&start);								//Get the start interval
//  d.QuadPart = g_ptFreq.QuadPart * ((double)us / 1000000.0);	//Caculate the total number of tics are equivalent to (us) microseconds
  d.QuadPart = ((double)us / 1000000.0);	//Caculate the total number of tics are equivalent to (us) microseconds


  do {
    QueryPerformanceCounter(&end);		//Get the end interval
    Sleep(0);
  } while (end.QuadPart - start.QuadPart < d.QuadPart);			//Check if the end is older
  
  return 0;

}


g_ptFreq.QuadPart というのが、よく分からないのですが、多分、精度に関係有るんでしょうか?
ためしに、それを削って、ループに、Sleep(0);を突っ込み、音声合成を走らせてみたら、


ちょっといじって、出来ました。

プチノイズが解消されているような気が。。( ´ ▽ ` )ノ



[追記]

どうやら、これに、Sleep(0);を突っ込んでも、意味がないようですね。。Σ(゚д゚lll)ガーン

ループしてないですから。。orz

つまり、単体で、Sleep(0)って、かいたのと同じでした。。
どこか間違っているのかな?


[追記2]

よーーーーくみたら、100万で割ってますね。。
300/ 100万で、0になるかも。。(;・∀・)

そうか。。100万で割るのが、要らないんだ。。取り外してみたら、
だんだん、ループしてきました。


徐々に、時間調整できるようになってきました。。時間を長くしていきます。


TALK命令実行して、発声が始まり、もうちょっとで終わる頃に、Okが帰ってくるぐらいまでは調整しましたが。。

あまり長くしすぎると、こんどは、プチノイズがのるんですよね。。むーん。


ところで、結局、for(i=0; i< 100; i++) Sleep(0); でも良かったのか?
むーん。