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();
}