10

マルチスレッド アプリケーションで UI (および完全な OS) の応答性を維持する必要がある場所の間で問題に直面しています。

複数のストリームから同時に多くのビデオ フレームを受信して​​変換するアプリケーション (c++ および Qt ベース) を開発しています。

各ストリームは、(DirectX を使用して) 独自の個別のワーカー スレッドで取得、変換、およびレンダリングされます。つまり、フレームのレンダリングにデフォルトの GUI スレッドを使用していないということです。

強力なコンピューターでは、CPU がすべてのデータを処理し、GUI スレッドがユーザーの要求を処理する時間を確保できるため、問題はありません。しかし、古いコンピューターでは機能せず、データを処理するために CPU が 100% 使用され、UI が遅くなり、ボタンのクリックが処理されるまでに 10 秒かかる場合があります。

UI の応答性を維持したいと考えています。実際、他に実行するアクションがない場合にのみ、ワーカー スレッドが機能するようにしたいと考えています。ワーカー スレッドの優先度を低く変更しようとしましたが、うまくいきません。ワーカースレッドでsleep(10)も試してみたのですが、スレッド数が多いので同時にスリープ状態にならないのでうまくいきません。

その場合 (ツールキットが何を使用していても) UI の応答性を維持する最善の方法は何ですか?

4

1 に答える 1

4

上記のリストにコメントを追加できないため、ここに数セントを追加する必要があります。

  • OSの応答性を高めたい場合は、RAMを消費しすぎず、プロセスを低い優先度で開始しないようにしてください。OSがプロセスのどのスレッドを実行するかを決定する必要がある場合にのみ、スレッドの優先度が考慮されますが、プロセス全体は引き続き機能しますシステムからの他のプロセスが考慮される場合、100% CPU で
  • あまり多くのスレッドを実行しないようにしてください。適切な解決策は、コアと同じ数の 100% CPU を使用するスレッドを作成することです。それ以上のスレッドが必要な場合は、マルチタスク手法を使用してください。

確認すべきことの 1 つ - 動画の表示方法を教えてください。ディスプレイ レート (ストリームからのデータ) がディスプレイ カードのリフレッシュ レートと一致していることを確認しますか? 表示するデータがある場合、画面を更新する必要があることをメインスレッドに通知しますか (より良い解決策)、または各スレッドからフレーム表示を強制しますか (悪い解決策)?

于 2012-07-17T12:38:47.643 に答える