1

私はQtに不慣れで、Qtのスレッドメカニズムを学ぼうとしています。バックグラウンドスレッドで長時間実行されるタスクを実行し、100アイテムごとに処理した後、結果を別の(またはメイン)スレッドに報告したいという状況にあります。現在、メインスレッドのスロットで受信された処理済みオブジェクトのリストを含むバックグラウンドスレッドからシグナルを送信することでこれを行っています。Qtは、スロットで受信されたときにシグナル引数のコピーを作成しますか?もしそうなら、電話はそれをどのようにqRegisterMetaType助けますか?これは私が私のコードで達成しようとしていることです:

//background thread
void run(){
   //get a query object from database
   int fireCount = 0;
   QList< QList<QVariant> > data;
   while(query->next()){
        fireCount++;
        QList<QVariant> row;
        //do some calculations on the fields read from the query
        processRow(query,&row);
        data.append(row);
        if(fireCount>100){
            emit publishDataToMainThread(data);
            fireCount = 0;
            data.clear();
        }
   }

}

//slot in main thread
void receiveData(QList< QList<Qvariant> > data){
\\display the data
}

また、これはスレッド間でオブジェクトを転送するための推奨される方法ですか?

4

1 に答える 1

1

これは完全に良い方法です。QListは暗黙的な共有(つまり、コピーオンライト)を使用するため、コピーするということは、1つのポインターをコピーし、参照カウントを増やすことを意味します。変更しようとするとコピーされます。信号をスロットに接続するときにQt::QueuedConnectionを使用して、スロットがレシーバースレッドで実行されるようにすることを忘れないでください。

qRegisterMetaTypeまたはQ_DECLARE_METATYPE、シグナルの値でパラメーターを渡すことができるようにするために必要です。このタイプが存在することをQtメタタイプシステム(一種のリフレクションのようなもの)に伝えます。

于 2012-09-17T07:21:22.150 に答える