2

私はアプリケーションの起動時にQtGUIスレッドで多くのアクティビティを実行しています(主にランタイム/初期化のトレードオフとして、文字通り1,000を超えるウィジェットを作成/事前割り当ておよび非表示にします。これは、動作中に応答性を維持する必要がある組み込みシステムです)。

レスポンシブ操作の目標は達成されましたが、今では初期化の応答性を高めるという課題があります。初期化をワーカースレッドにスレッド化することはオプションではありません。CPU負荷のほとんどはQtGuiの呼び出し内から発生し、それらはメインスレッドで発生する必要があります。

それで、他のすべてのイベントを処理するためにアプリに制御を譲るオプションがあるのだろうか?再描画などを行いますか?

4

2 に答える 2

4

コードに呼び出しをまき散らす必要なしに、よりクリーンにprocessEvents():作成/事前割り当てをスロットとして実装します。デザインと好みに応じて、カプセル化されたステートマシンを使用して1つのスロットにするか(次に何をするかを知っている)、さらにスロットを作成するか、共通のインターフェイスを使用していくつかのクラスに委任します。スロットへの通話が終了するたびに、キューに入れられた接続として自分自身に通話を再度投稿します。

slots: void makeWidget();
signals: void widgetMade();
...
connect(this,SIGNAL(widgetMade()),this,SLOT(makeWidget()),Qt::QueuedConnection);

そうすれば、ウィジェットの作成は他のGUIアクティビティと同じようにキューに入れられます。明示的な5番目のパラメーター修飾子が必要です。同じスレッドにいるため、デフォルトQt::AutoConnectionは解決されます。Qt::DirectConnectionボーナスとして、初期化するウィジェットの数がわかっている場合は、初期化の非ブロッキングプログレスバーを実際に実行できます。

于 2012-09-09T20:40:30.680 に答える
0

私のGoogleFuがしばらくの間私を捨てていたようです:

qApp->processEvents()

これにより、すべての未解決のGUIイベントが処理されます。十分な頻度で呼び出すだけで問題が解決します。

于 2012-09-09T20:29:42.103 に答える