【发布时间】:2010-11-16 00:56:47
【问题描述】:
在我的应用程序中有一个主线程和一个工作线程 (QThread)。
我想从主线程调用我的工作线程的方法并让它在线程的上下文中运行。
我尝试使用 QMetaObject::invokeMethod 并为其指定 QueuedConnection 选项,但它不起作用。
我也尝试过从主线程(连接到工作线程的插槽)发出信号,但也失败了。
这是我尝试过的大致的sn-p:
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();
}
这两种方式都会导致在QThread doWork 中打印主线程ID。
另外,我想过实现一个简单的生产者-消费者,但如果可行,有什么理由不这样做吗?
【问题讨论】:
标签: c++ multithreading qt qthread