2012-12-27 9 views
6

私は2つのプロジェクトを持っています。 1つはMFCスタイルのないC++ Builderによって構築されています。そして、他のものはVC++ MFC 11です。音声がオフのときスレッドが遅い

スレッドを作成してサイクルを作成すると、このサイクルでプログレスバーの位置に1を加算します。つまり、Sleep(10)を使用して1から100になります。C++ BuilderとC++ MFC。

ここで、Sleep(10)は10ミリ秒待機します。 OK。しかし、問題は私がオープンメディアプレーヤー、Winamp、または "サウンド"を生成する何かを持っている場合のみです。すべてのメディアプレーヤー、Winamp、およびその他のサウンドプログラムを閉じると、スレッドが10ミリ秒より遅くなります。

50-100 ms/eachのようになります。もし私が音楽を開くと、それは期待通りに正常に動作します。

なぜこのようなことが起こっているのかわかりません。私は最初にMFC Appの内部で間違いを犯したと思ったが、なぜC++ Builderも遅くなったのだろうか?

はい、私はそれが私の窓を再構成し、すべてを無効にしているので、それは音に関連していると確信しています。最後に、私はその問題を発見しました。

私のコードに何か必要がありますか?

更新

は今、私は、コードをたどると、私は1ミリ秒を待つために、このような分野でSleep(1)を使用したことが分かりました。その理由は、オブジェクトを左から右へ移動させるからです。私はこの睡眠を削除すると、それは非常に高速であるため、移動が表示されません。だから、私はSleep(1)を使うべきです。 Sleep(1)の場合、音声がの場合はになります。音声がからを除いて非常に遅い場合。

for (int i = 0; i <= 500; i++) { 
    theDialog->staticText->SetWindowsPosition(NULL, i, 20, 0, 0); 
    Sleep(1); 
} 

です。これに関する提案は本当に感謝しています。私は何をすべきか?

これは間違った方法です。私は適切で有効な何かを使うべきです。しかし、正確に何ですか?静的テキストをある位置から別の位置にスムーズに移動させるために役立つ関数やクラスはどれですか?

また、スレッドの優先度を変更すると、は役に立ちませんでした。

アップデート2

Update 1には、別の質問:) 少なくとも 10ミリ秒間

+0

興味深い。あなたのプロセスの優先順位は、違いに気づいたときでも同じですか? – Brad

+1

プロセスの優先順位は同じです。 2番目の興味深いのは、もし私が(音楽を再生していない)メディアプレーヤーを開くと、私のスレッドプログラムはCPUとスレッドの2%で動作します。メディアプレーヤーを閉じると、即座に減速し、CPUの使用率は0%になります。 – xangr

+2

これは、プロセッサがCPUの周波数を絞っていることが原因である可能性があります。 – johnathon

答えて

4

スリープ(10)は、わかっているように、約10ミリ秒待ちます。その時点で実行する必要のある優先順位の高いスレッドがある場合は、スレッドの起動が遅れることがあります。マルチメディアスレッドはおそらくReal-TimeまたはHighプライオリティで動作しているため、サウンドを再生するとスレッドウェイクアップが遅れることがあります。システムは、指定されたミリ秒の約 数のスレッドがスケジュールではない可能

は、Microsoft Windows(第4版)、第7章のセクション睡眠のためのプログラミングアプリケーションでのジェフリーRichtersのコメントを参照してください。そうです、システムに を100ミリ秒間スリープ状態にしたいと言うと、およそ という長さですが、おそらく数秒または数分かかるでしょう。 Windowsはリアルタイムオペレーティングシステムではありません。あなたのスレッドは、おそらく 目覚ましが適切な時間になるかどうかは、システム内の が何であるかによって異なります。

またMSDN Multimedia Class Scheduler Service (Windows)あたりとして

MMCSS は、時間に敏感な処理はCPUリソースへの優先順位のアクセスを受けることを保証します。

は、上記のドキュメントごとに、あなたはまた、timeBeginPeriod()

Sleep()タイミングのための最小分解能が設定されている
4

Sleep(10)待ちます。実際にどのくらい待ったかをチェックするコードを書かなければならず、コードが10ミリ秒を超えていれば、それをコードで処理する必要があります。 Windowsはリアルタイムオペレーティングシステムではありません。

+0

彼はこれを知っていると確信しています。問題は、量子の大きさに大きな影響を与えるか、それともランダムなチャンスであるかということです。また、問題に応じて、「賢明に扱う」ということはまったく問題になりません(オーディオやビデオの再生など)。 @Vooが正しくあります。 – Voo

+0

私はこれを知っています。私はIDEをインストールした後に 'SetSystemPowerState()'関数を使ってこの問題を解決しようとします。 – xangr

+0

@Voo:彼は進行状況バーの位置を更新しています。それを分かりやすく扱うことは事実上些細です。 –

2

システム全体のキーレジストリを通じて、優先度の低いタスクに保証されるCPUリソースの割合を制御することができますおよびtimeEndPeriod()。たとえば、timeBeginPeriod(1)を渡すと、最小解像度が1ミリ秒に設定されます。オーディオプログラムが解像度を1ミリ秒に設定しており、完了したときに10ミリ秒以上に復元している可能性があります。私はSleep(1)を使用したプログラムに問題がありましたが、それはXE2 IDEが動作していてもうまくいきましたが、それ以外の場合は12msの間スリープします。プログラムの冒頭に直接timeBeginPeriod(1)を設定して問題を解決しました。

参照:http://msdn.microsoft.com/en-us/library/windows/desktop/dd757624%28v=vs.85%29.aspx