ネタです。
あくまで、個人的に出来ただけなので、信用しないで下さい。備忘録で書いているだけです。責任はもてません。
初めは、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); でも良かったのか?
むーん。