waveOutOpenメソッドとwaveOutWriteAPIメソッドを使用して小さなチャンクを連続して再生することで長いWAVファイルを再生するコードエンジンがあります。ファイルの再生中にUIを更新するために、各バッファーの再生が完了するとコールバック関数から、フォームのメソッドを呼び出す別のスレッドを呼び出します(コールバック関数内で実行することはできるだけ少なくしたいため)。
EventHandler
フォームには、 UI要素を新しい情報で更新するメソッドを処理するクラスレベルが含まれています。waveOutWriteコールバック関数から呼び出されるformメソッドでは、次のようにInvokeメソッドを使用します。
if (_updatedisplay == null)
{
// UpdateDisplay contains code to set control properties on the form
_updatedisplay = new EventHandler(UpdateDisplay);
}
Invoke(_updatedisplay);
すべてが機能しますが、UI要素の更新に顕著な遅延または遅延があるように見えます。UpdateDisplayメソッドを使用してアニメーションを駆動しているため、これは簡単にわかります。そのため、遅延は「一時的な中断」として表示され、スプライトは予想される位置にジャンプする前に一瞬フリーズします。
このようなクロススレッド通信には、長い(おそらく10〜15ミリ秒)遅延が発生する可能性がありますか?もしそうなら、このようなものを処理するためのより良い方法は何ですか?
更新:ちなみに、それがここの原因かどうかは確かにわかりませんInvoke
。もう1つの可能性は、オーディオのチャンクの再生が終了してからコールバック関数が実際に呼び出されるまでの遅延です。
更新2:itowlson
の提案に従って、メソッド呼び出しSystem.Diagnostics.Stopwatch
間のラグをベンチマークするためにを使用しました。Invoke
1156回の測定のうち、0msで1146、1msで8、2msで2を取得しました。Invoke
ここでの私の犯人ではないと言っても差し支えないと思います。