こういう遅延は仕方ないのでしょうか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
かなたん
記事: 50
登録日時: 12年前
連絡を取る:

こういう遅延は仕方ないのでしょうか?

#1

投稿記事 by かなたん » 11年前

Visual Studio 2008を使ってMFCで30秒の間に4,1,3,2,4という数字の列を何回打つことができるかというプログラムを作っています。

3(ポーン)、2(ポーン)、1(ポーン)、0(ピーン)
というような感じでカウントダウンの表示と共にリソースのwaveファイルを鳴らしています。
ですが、なぜか
3(聞こえない)、2(ポーン)、1(ポーン)、0(ポーン)、(ピーン)
と1秒遅れて聞こえてきます。

コード:

SetTimer(1,1000,NULL);
でタイマーを作り、OnTimerで

コード:

HINSTANCE hInst = AfxGetInstanceHandle();
if(timer>0){
	::PlaySound( MAKEINTRESOURCE( IDR_PO_N ), hInst, SND_RESOURCE | SND_ASYNC );
}
else if(timer==0){
	::PlaySound( MAKEINTRESOURCE( IDR_PI_N ), hInst, SND_RESOURCE | SND_ASYNC );
	cTime=CTime::GetCurrentTime();
}
timer--;
というようにして音を鳴らしています。
timerはSetTimerの前に3で初期化しています。
wavファイルはAudacityを用いて周波数と長さを用いて作成したもので、長さはそれぞれ0.5秒(44KB)です。

SetTimerの後で画面を切り替えてすぐカウントダウンを開始しているのが原因かとも思い、timerを4から始めて
[4は表示しない](音も鳴らさない)、3(ポーン)、2(ポーン)、1(ポーン)、0(ピーン)
のつもりで作り変えてみました。
それでも
[4は表示しない](音も鳴らさない)、3(聞こえない)、2(ポーン)、1(ポーン)、0(ポーン)、(ピーン)
と1秒遅れて聞こえてきます。
表示のほうが1秒早いのでは?という考えは違ったかもしれません。
もともと1秒音が遅れることを見越して4のところで音を鳴らす命令を書けばきちんと聞こえるかもしれませんが、わざわざそういうことをする必要はないと思っています。

初めはRAMが98%も使用されていたので、だから重いのでは?と思いめもりーくりーなーを使ってメモリを掃除したところ、50%程度まで下がりました。
(CPUはどちらも20%前後)
それでも結果は変わらずでした。
ちなみに同じようにして作った0.1秒(9KB)の正誤判定の音は、30秒に約30セット×5回鳴らしても遅延することなく鳴ってくれているように思います。

リソースのwaveファイル0.5秒分44KBを読み込んで鳴らすという処理は遅延が発生するほど時間がかかるものなのでしょうか?
それとも、私の処理のさせ方がよくなかったのでしょうか?
わからないことも、ブログに書いているうちにひらめくこともある。
本当に行き詰ったら、考え直すのも1つの手かな。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: こういう遅延は仕方ないのでしょうか?

#2

投稿記事 by みけCAT » 11年前

timerを計算するタイミングに問題がある気がします。
実際の処理は
(鳴らさない)3、(ポーン)2、(ポーン)1、(ポーン)0、(ピーン)
となっているのではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かなたん
記事: 50
登録日時: 12年前
連絡を取る:

Re: こういう遅延は仕方ないのでしょうか?

#3

投稿記事 by かなたん » 11年前

OnKeyDownで
スペースが押された→timerを4にする→SetTimerを実行→Invalidateを実行・・・①
としていて、
OnTimerでは
timerが3~1ならポーンを鳴らし、0ならピーンを鳴らす→timerを1減らす→Invalidateを実行・・・②
としていました。
そのtimerを1減らすタイミングを音を鳴らす前に変えると、画面の数字と音が一致しました。

①でSetTimerを実行した後約1秒後に②が実行されることになるから、初めの書き方だと
①終了→画面にtimerが4だから表示しない→約1秒経過→②実行開始→timerが4だから音を鳴らさない→timerをを1減らす→②終了→
画面にtimerの3を表示→約1秒経過→②実行開始→timerが3だからポーンを鳴らす→timerをを1減らす→②終了→
画面にtimerの2を表示―
というように音より先に画面の数字が変わってしまっていたんですね。
これで納得しました。
ありがとうございました。
わからないことも、ブログに書いているうちにひらめくこともある。
本当に行き詰ったら、考え直すのも1つの手かな。

閉鎖

“C言語何でも質問掲示板” へ戻る