6

私は2つのプロジェクトを持っています。1 つは、MFC スタイルなしで C++ Builder によってビルドされます。もう1つはVC++ MFC 11です。

スレッドを作成してサイクルを作成すると、たとえば、このサイクルがプログレスバーの位置に 1 を追加するとします。これを使用Sleep(10)すると、もちろん C++ Builder と C++ MFC の両方で機能します。

さて、Sleep(10)10ミリ秒待ちます。わかった。しかし、問題は、メディアプレーヤー、Winamp、または「サウンド」を生成するその他のものを開いている場合のみです。すべてのメディア プレーヤー、winamp、およびその他のサウンド プログラムを閉じると、スレッドの速度が 10 ミリ秒未満になります。

のようにかかります50-100 ms / each。音楽を開くと、期待どおりに正常に機能します。

なぜこれが起こっているのか分かりません。最初は MFC アプリ内でミスをしたと思ったのですが、なぜ C++ Builder も遅くなるのでしょうか?

はい、ウィンドウを再フォーマットし、すべてを無効にしたので、サウンドに関連していると確信しています。最後に、その音の問題を発見しました。

私のコードには何かが必要ですか?

更新

さて、コードをたどってみるとSleep(1)、そのような領域で 1 ミリ秒待機していたことがわかりました。その理由は、オブジェクトを左から右に移動するからです。このスリープを削除すると、非常に高速であるため、移動が表示されません。だから、私は使用する必要がありますSleep(1)。でSleep(1)、オーディオがオンの場合は機能します。オーディオがオフの場合、非常に遅くなります。

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

したがって、これに関する提案は本当にありがたいです。私は何をすべきか?

私はこれが間違った方法であることを知っています。適切で有効な別のものを使用する必要があります。しかし、正確には何ですか?静的テキストをある位置から別の位置にスムーズに移動するのに役立つ関数またはクラスはどれですか?

また、スレッドの優先度を変更しても効果はありませんでした。

更新 2 :

更新1は別の質問です:)

4

3 に答える 3

4

Sleep(10)少なくとも10 ミリ秒待機します。実際に待機した時間を確認するコードを作成する必要があり、それが 10 ミリ秒を超えている場合は、コードで適切に処理する必要があります。Windows はリアルタイム オペレーティング システムではありません。

于 2012-12-27T07:22:08.793 に答える
2

タイミングの最小分解能は、および でSleep()システム全体に設定されます。たとえば、pass は最小分解能を 1 ミリ秒に設定します。オーディオ プログラムが解像度を 1 ミリ秒に設定し、終了時に 10 ミリ秒以上に復元している可能性があります。XE2 IDE が実行されているときにのみ正常に動作し、それ以外の場合は 12 ミリ秒スリープするプログラムに問題がありました。プログラムの最初に直接設定することで問題を解決しました。timeBeginPeriod()timeEndPeriod()timeBeginPeriod(1)Sleep(1)timeBeginPeriod(1)

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

于 2013-02-19T15:42:27.040 に答える