1

C++ でできるだけ 30 ミリ秒近くでループを終了する最善の方法は何ですか? ポーリング ブースト:microsec_clock ? ポーリング QTime ? 他の何か?

何かのようなもの:

A = now;
for (blah; blah; blah) {
    Blah();
    if (now - A > 30000)
         break;
}

Linux、OS X、および Windows で動作するはずです。

ループ内の計算は、シミュレーションを更新するためのものです。30 ミリ秒ごとに、ビューポートを更新したいと思います。

4

9 に答える 9

11

ループ内の計算は、シミュレーションを更新するためのものです。30msごとにビューポートを更新したいのですが。

スレッドの使用を検討しましたか?あなたが説明することは、タイマーの代わりにスレッドを使用する必要がある理由の完璧な例のようです。

メインプロセススレッドはUIを引き続き処理し、QTimerを30msに設定して更新します。QMutexをロックしてデータにアクセスし、更新を実行して、ミューテックスを解放します。

2番目のスレッド(QThreadを参照)がシミュレーションを実行します。サイクルごとに、QMutexをロックし、計算を実行し、データが安定した状態(UIの更新に適している)のときにミューテックスを解放します。

マルチコアプロセッサの増加傾向に伴い、タイマーの使用よりもスレッドの使用についてますます考える必要があります。アプリケーションは、新しいプロセッサのパワーの増加(複数のコア)から自動的に恩恵を受けます。

于 2009-06-03T19:21:46.880 に答える
4

これは質問への回答にはなりませんが、解決策をもう一度見ることができるかもしれません。シミュレーション コードとユーザー インターフェイスを別のスレッドに配置するのはどうでしょうか。Qt を使用する場合、定期的な更新はタイマーまたはQThread::msleep()を使用して実現できます。必要に応じて、スレッド化されたマンデルブロの例を適応させることができます。

于 2009-06-03T19:47:43.737 に答える
2

あなたの質問によると、30msごとにビューポートを更新したいと思います。私は、500 ミリ秒ごとにハードウェアを調べて同様のものを探す、同様のアプリを書いたことがあります。これはあなたの質問に直接答えるものではありませんが、次のフォローアップがあります。

  • ビューポートを更新するための Blah() は、すべてのインスタンスで 30 ミリ秒未満で実行できると確信していますか?
  • Blah() の実行は、タイマー コールバックの方が適しているようです。
  • グラフィカル フレームワークで更新を行うために 30 ミリ秒間隔でプッシュするライブラリ タイマー オブジェクトを見つけるのは非常に困難です。Windows XP では、タイマー間隔の満了時にウィンドウ メッセージをプッシュする標準の Win32 API タイマーは、2 GHz P4 でも、タイミング間隔をどれほど低く設定しても、300 ミリ秒間隔より速く更新できないことがわかりました。タイマー。Win32 API には高パフォーマンスのタイマーがありましたが、多くの制限があります。つまり、上で引用したようなループで IPC (UI ウィジェットの更新など) を実行することはできません。
  • 基本的に、結果として、更新をどのように行うかを非常に慎重に計画する必要があります。スレッドを使用し、ビューポートを更新する方法を検討する必要がある場合があります。

考えるべきことがいくつかあります。私が自分のプロジェクトに取り組んでいたとき、彼らは私を驚かせました。これらのことをすでに熟考している場合は、私の答えを無視してください:0)。

于 2009-06-03T18:47:12.627 に答える
2

K ミリ秒ごとではなく、N シミュレーション ステップごとにビューポートを更新することを検討することもできます。これが(たとえば)本格的な商用アプリである場合は、おそらく他の場所で提案されているマルチスレッド ルートに進みたいと思うでしょう。あなたがシミュレートしているものの詳細です.Nステップごとはシンプルで移植性があり、うまくいくのに十分かもしれません.

于 2009-06-03T20:04:39.647 に答える
2

簡単に言えば、一般的にはできませんが、適切な OS または適切なハードウェアで実行している場合は可能です。

Intelシステムではアセンブリ呼び出しを使用し、他のアーキテクチャでは何か他のものを使用して、すべてのOSで30msに近づくことができます。参照を掘り起こし、回答を編集して、見つけたコードを含めます。

問題は、タイム スライス アルゴリズムと、マルチタスク OS でのタイム スライスの終わりにどれだけ近づいているかです。

一部のリアルタイム OS では、システム ライブラリに作成できるシステム コールがありますが、そのコールが何であるかはわかりません。

編集:笑!SO: Timer function to provide time in nano seconds using C++

VonC には、CPU タイマー アセンブリ コードを含むコメントが含まれています。

于 2009-06-03T18:07:34.500 に答える
2

一定の時間が経過するまで作業を行う必要がある場合は、docflabby の答えが的を射ています。ただし、指定された時間が経過するまで何もせずに待つ必要がある場合は、次を使用する必要がありますusleep()

于 2009-06-03T18:08:07.683 に答える
2

このリンクのコード スニペットの例は、あなたが望むことをほとんど行います。

http://www.cplusplus.com/reference/clibrary/ctime/clock/

彼らの例から適応:

void runwait ( int seconds )
{
   clock_t endwait;
   endwait = clock () + seconds * CLOCKS_PER_SEC ;
   while (clock() < endwait)
   {
      /* Do stuff while waiting */
   }
}
于 2009-06-03T18:00:14.720 に答える
0

Qt を使用している場合、これを行う簡単な方法を次に示します。

QTimer* t = new QTimer( parent ) ;
t->setInterval( 30 ) ; // in msec
t->setSingleShot( false ) ;
connect( t, SIGNAL( timeout() ), viewPort, SLOT( redraw() ) ) ;

viewPortと を指定する必要がありますredraw()。次に、 でタイマーを開始しt->start()ます。

于 2009-06-03T19:04:13.653 に答える