2

本当に行き詰まりました。アドバイスや実際の例が必要です。

1) boost::thread ベクター プロデューサー スレッドを持っています (データは 1 秒あたり 100 サンプルまで高速に到着します) 2) QMathGL に到着時にデータを描画させたい 3) Qt GUI をフリーズさせたくない

QMathGL::update() を別のスレッドに移動しようとしました - Qt は、別のスレッドでは QPixmap が許可されていないと主張しています。

QMathGLを変更せずに何を試すべきですか?

タイマー(fps?)で再描画することだけが頭に浮かびますが、私はこの解決策が好きではありません。間違っている場合は教えてください。

4

2 に答える 2

2

タイマーと一緒に行くことを強くお勧めします。再描画操作はコストがかかります。1 秒間に 10 を超える印刷されたベクトルを現実的に処理できるユーザーはいないと思います。したがって、ディスプレイがより「スムーズに」更新され、エントリごとにエントリが表示されることを除けば、エンドユーザーにとっての本当のメリットはわかりません。しかし、アニメーションを使えば、これらの効果をはるかに簡単に実現できます ;)

データが変更されるたびに再描画すると、説明した迷惑な動作が発生します。それを回避することは(私見)面倒な価値はありません。

于 2012-11-29T09:29:08.280 に答える
0

私も時々同様の問題に遭遇しました。

私が使用した通常の解決策は、データをバッファリングし、タイマーで再描画することです。これは、これ(疑似コード)の行に沿って進みます:

void Widget::OnNewData(void *dataSample)
{
    this->threadSafebuffer->appendData(dataSample);
}
void Widget::OnTimeout()
{
    DataBuffer renderBatch = this->threadSafebuffer->interlockedExchange();
    /* Do UI updates according to renderBatch */

}

これは、OnNewData がバックグラウンド スレッドで呼び出されることを前提としています。OnTimeout は、UI-EventLoop の QTimer から呼び出されます。競合を防ぐために、現在のバッファ ポインタを 2 番目のバッファとインターロック交換するだけです。そのため、重度の同期 (Mutext/Semaphore など) は必要ありません。

これは、renderBatch をレンダリングするために実行する作業量がタイムアウトよりも少ない場合にのみ機能します。

于 2012-11-30T09:35:59.167 に答える