ワーカー スレッドで実行する予定の非 GUI 操作があります。グーグルで調べた後、ここでこれを達成する簡単な方法を見つけました
特に がQMetaObject::invokeMethod()
よく似合います。また、QThread をサブクラス化せず、代わりに QObject をサブクラス化してワーカー オブジェクトを作成し、このオブジェクトのスレッド アフィニティを新しく作成されたスレッドに移動するように注意しました。(ここに少し詳しく書かれています
今私の質問:
メインスレッドからメソッドのキューイングを開始します (これは、QEventLoop を設定していなくても、再実装QThread::run()
も呼び出しもしていなくても、内部で QEventLoop を使用して発生しているとQThread::exec()
思います)処理を終了しました。つまり、QEventLoop がいつ空になるかを知る必要があります。これにはシグナル finished() を使用できると思いました。しかし、うまくいかないようです。ワーカースレッドの実行がいつ終了したかを知る方法について、誰かが光を当てることができますか? さらに情報/コードが必要な場合は、お知らせください。
Class Plugin は QObject のサブクラスです
Plugin::Plugin()
{
m_workerThread = new QThread(this);
m_workerThread->start(QThread::IdlePriority);
m_worker = new DataWorker(this);
connect(m_workerThread, SIGNAL(finished()), m_worker, SLOT(deleteLater()));
m_worker->moveToThread(m_workerThread);
}
...
Plugin::updateData()
{
....
if( true == QMetaObject::invokeMethod(m_worker, "RunFProcToGetData", Qt::QueuedConnection, Q_ARG(QString, foo)))
{
qDebug() << "successfully invoked RunFProcToGetData";
}
if( true == QMetaObject::invokeMethod(m_worker, "updateDataIntoDB", Qt::QueuedConnection, Q_ARG(QSqlDatabase, db), Q_ARG(QString, foo)))
{
qDebug() << "successfully invoked updateDataIntoDB";
}
....
}
Dataworker クラスで
Dataworker::RunProcToGetData(const QString &foo)
{
// invoke a program to get the Data
}
Dataworker::updateDataIntoDB(const QSqlDatabase& db, const QString &foo)
{
// Update database
}
したがって、処理する updateDataIntoDB と RunFProcToGetData がなくなったら、トリガーが必要です。