1

Qtはとても新しいです。wikiとC++Guiプログラミングの本を読んでください。彼らはサブクラスQThreadと言っています。現在、これは推奨される方法ではないことがわかりました。

だから私はここにいくつかの練習コードがあり、これが正しいかどうかについていくつか質問があります。ですので、よろしくお願いします。

そこで、movetothreadに使用するプライベートメンバーとしてQThreadを使用してクラスを作成しました。作成するときは、親を指定しないようにしました。したがって、私の最初の質問は、これで大丈夫ですか?

2番目の質問はm_thread->quit()から来ています。これを行うまで、完了への接続が発行されていなかったことがわかりました。それで、これは正しい方法ですか?http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/を読んで、同じスレッドでfinishedとdeleteLaterの間の接続を確認しましたがこれをquitと一緒に使用する必要があるかどうかは100%わかりません。

最後に、deleteLaterの話で、これはm_threadを削除する必要がないことを意味しますか?

みなさん、ありがとうございました。

ここにコーディングします。プッシュボタン付きのシンプルなQDialog。 worker.cpp

#include "worker.h"

worker::worker(QObject *parent) :
    QObject(parent)
{
    stopped = false;
}

void worker::setupAndRun()
{
    m_thread = new QThread();
    connect(m_thread,SIGNAL(started()),this,SLOT(doWork()));
    connect(m_thread,SIGNAL(finished()),this,SLOT(onComplete()));
    connect(m_thread,SIGNAL(finished()),m_thread,SLOT(deleteLater()));
    this->moveToThread(m_thread);
    m_thread->start();
}

void worker::doWork()
{

    for(int i = 0; i < 20000; i++)
    {
        if (this->stopped)
            break;
        qDebug() << i << " : " <<  Q_FUNC_INFO << m_thread->currentThreadId();
    }
    // --- I think the quit calls the finished signal?
    m_thread->quit();

}

void worker::onComplete()
{
    qDebug() <<  Q_FUNC_INFO << "Called " << m_thread->currentThreadId();
}

worker.h

#ifndef WORKER_H
#define WORKER_H

#include <QObject>
#include <QDebug>
#include <QThread>

class worker : public QObject
{
    Q_OBJECT
public:
    explicit worker(QObject *parent = 0);
    void setupAndRun();
signals:

public slots:
    void doWork();
    void onComplete();
private:
    // --- The thread that I use to movetothread with.
    // Is this ok?
    QThread *m_thread;
    bool stopped;
};

#endif // WORKER_H

ダイアログプッシュボタン

void Dialog::on_pushButton_clicked()
{
    m_worker = new worker();
    m_worker->setupAndRun();
}
4

1 に答える 1

2

私は一目で何も見つけませんでしたが、何か:

はメンバー変数なのでm_thread、少し異なる方法で処理する必要があります。nullコンストラクターで初期化することもm_thread = null、呼び出し後に設定することもできます。これm_thread->quit()は、すぐに削除され、ダングリングポインターが必要ないためです。

このコードでは、終了したシグナルをm_workerのdeleteLater()にも接続する必要があります。これは、それを削除する他のコードがないように見えるためです。また、たとえばqAddPostRoutineを使用してアプリケーションが終了するときにスレッドを処理して、すべてのスレッドが終了し、関連するすべてのオブジェクトが削除されるようにする必要があります。

于 2012-10-17T10:47:41.063 に答える