在我的應用程序中有主線程和工作線程(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()函數,工作線程在事件循環中, – 2009-08-01 18:49:57