3

http://doc.qt.io/qt-5/qpointer.htmlによると、QPointerは非常に便利です。しかし、次のコンテキストでは非効率的である可能性があることがわかりました。

ラベルを3回表示したい場合、または何か他のことをしたい場合は、

if(label) label->show1(); if(label) label->show2(); if(label) label->show3();

それ以外の if(label) { label->show1();label->show2();label->show3(); }

またはの後に別のスレッドでラベルが破棄される可能性があるという理由だけでlabel->show1();label->show2();.

同じ機能を取得するための3つのif以外の美しい方法はありますか?

もう1つの質問は、if(label)の後にラベルが破棄されても、if(label) label->show1();まだ間違っているということです。

マルチスレッドプログラムの経験がありません。どんな助けでも大歓迎です。;)

4

2 に答える 2

6

それを行う唯一の安全な方法は、メイン/ GUIスレッド(つまり、QApplication :: exec()内でQtのイベントループを実行しているスレッド)内からのみQWidgetsにアクセスすることを確認することだと思います。

別のスレッド内で実行されているコードがあり、そのコードでQLabelを表示/非表示などにする必要がある場合、そのコードはQEventオブジェクト(またはそのサブクラス)を作成し、qApp-> postEvent()を呼び出す必要があります。そのオブジェクトをメインスレッドに送信します。次に、QtイベントループがメインスレッドでそのQEventを取得して処理すると、コードがQLabelに対して安全に処理できるようになります。

あるいは(そしておそらくもっと簡単に)、スレッドのコードがクロススレッドシグナルを発行し(ここで説明されているように)、Qtにイベント投稿を内部で処理させることができます。それはあなたの目的にとってより良いかもしれません。

于 2011-09-28T23:18:39.610 に答える
1

どちらのアプローチもスレッドセーフではありません。最初のスレッドがifステートメントを実行し、次に他のスレッドがラベルを削除し、ifステートメントの内部にいてクラッシュする可能性があります。

Qtは、いくつかのスレッド同期構造を提供します。このプログラムで作業を続ける前に、 QMutexから始めて、スレッドセーフについて詳しく学ぶことをお勧めします。

ミューテックスを使用すると、関数は次のようになります。

mutex.lock();
label1->show();
label2->show();
label3->show();
mutex.unlock()

他のスレッドが同じミューテックスオブジェクトのロックを使用している限り、表示中にラベルを削除することはできません。

于 2011-09-28T20:58:42.177 に答える