私のアプリケーションには、メインスレッドとワーカースレッド(QThread
)があります。
メインスレッドから、私のワーカースレッドのメソッドを呼び出して、スレッドのコンテキストで実行させたいと思います。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
に印刷されています。
また、私は単純なプロデューサー - コンシューマーを実装することを考えましたが、これが機能すれば、このようにしない理由がありますか?
exec()の呼び出しのためにワーカースレッドがイベントループ内にあります。 –