私のアプリケーションには、メイン スレッドとワーカー スレッド ( QThread
) があります。
メイン スレッドから、ワーカー スレッドのメソッドを呼び出して、スレッドのコンテキストで実行したいと考えています。
使用QMetaObject::invokeMethod
してQueuedConnection
オプションを指定してみましたが、機能しません。
また、メイン スレッド (ワーカー スレッドのスロットに接続されている) から信号を発信しようとしましたが、これも失敗しました。
これが私が試したことの大まかなスニペットです:
class Worker : public QThread
{
Q_OBJECT
public:
Worker() { }
void run()
{
qDebug() << "new thread id " << QThread::currentThreadId();
exec();
}
public slots:
void doWork()
{
qDebug() << "executing thread id - " << QThread::currentThreadId();
}
};
QMetaObject の方法を使用する:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "main thread id - " << QThread::currentThreadId();
Worker worker;
worker.start();
QMetaObject::invokeMethod(&worker, "doWork", Qt::QueuedConnection);
return a.exec();
}
シグナルウェイを使用:
class Dummy : public QObject
{
Q_OBJECT
public:
Dummy() { }
public slots:
void askWork() { emit work(); }
signals:
void work();
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "main thread id - " << QThread::currentThreadId();
Worker worker;
worker.start();
Dummy dummy;
QObject::connect(&dummy, SIGNAL(work()), &worker, SLOT(doWork()), Qt::QueuedConnection);
QTimer::singleShot(1000, &dummy, SLOT(askWork()));
return a.exec();
}
どちらの方法でも、メイン スレッド ID が に出力されますQThread
doWork
。
また、単純なプロデューサー・コンシューマーの実装も考えましたが、これがうまくいくなら、このようにしない理由はありますか?