在我的应用程序中有一个主线程和一个工作线程(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
.
另外,我想实现一个简单的生产者-消费者,但如果可行,有什么理由不这样做吗?