1

アプリケーションをマルチスレッド化したとします。Widgets次に、Qt の哲学に従って、GUIに追加されたプロパティを変更することさえできません。クラス のオブジェクトがNot_GUI別の に移動されたとします。その場合、 の関数で( GUI に追加された)をQThread呼び出すことは違法です。button1->SetEnabled(false);button1QPushButtonNot_GUI

現在、私のアプリケーションには多くの GUI widgets(QLabel、QLineEdit など) があり、それらeventsはすべて 1 つのスレッドで処理されるため、膨大な描画アクティビティのためにアプリケーションがしばらくハングします。Widgetsワークロードの一部をさまざまなスレッドに分散する方法はありますか?

4

3 に答える 3

1

最初の例では、シグナルとスロットを使用します。QWidget::setEnabled()スロットです。信号を作成modifyWidgetEnableState(bool)し、スロットに接続します。直接メソッド呼び出しを使用する代わりにシグナルをトリガーします。

大量のペイント アクティビティが原因で、アプリケーションがしばらくハングする

これらのウィジェットは Qt に組み込まれていますか? はいの場合、ハングは絵が原因であるとは思えません。これらのウィジェットはあなたのものですか? その場合、サブクラス化されたイベント ハンドラーで過剰な処理を行っている可能性があります。最初にやるべきことは、あなたがしていることのパフォーマンスを向上させることです.2番目のことは、重い処理をスレッドに移動し、(再び)シグナルとスロットを使用してウィジェットと通信することです.

編集: o1 と o2 を想定し、別のスレッド t1 と t2 に移動します。

o2->slot()が通常の関数呼び出しとして実行されるときは常に、実行中の呼び出しスレッドですslot()slot()結局のところ、通常の C++ メソッドであることを忘れないでください。sig()に接続されたシグナルslot()がトリガーされるたびに、実行されているのはレシーバースレッドslot()です。したがって、どちらかを選択してください。そうしないと、競合状態が発生します。

于 2013-03-14T09:56:19.073 に答える
0

任意の関数を呼び出して、別のスレッドから ui を変更QMetaObject::invokeMethod()し、使用できる別のスレッドで関数を実行できますQtConcurrent::run(私は で使用しますQFutureWatcher)。おそらく標準的なQtの方法ではありませんが、すべての関数に対して独自のQThread::runを作成したくない場合は、うまく機能します

于 2013-03-15T10:54:47.013 に答える
0

あなたが言うように、Qt ではすべてのウィジェットの描画をメイン スレッドで行う必要があります。それを回避する方法はありません。別のスレッドでにペイントしてからQImage、その でウィジェットに画像を描画するだけpaintEvent()です。ただし、最初に、すべてのバッファ イメージに対して余分なメモリが必要になることに注意してください。また、それができれば、スレッド化せずに同じアプローチを取る方が簡単かもしれません。一般に、あなたの目標は、内部でできる限り少ない作業を行うことpaintEvent()です。

于 2013-03-14T09:58:09.037 に答える