如果我创建一个 QThread 并从另一个线程调用它的一个插槽,它将在 QThread 对象的线程的上下文中调用,还是从进行调用的线程的上下文中调用?
问问题
713 次
3 回答
4
如果您通过发出信号来执行插槽,那么这取决于您拥有的信号到插槽连接的类型。通过直接连接连接到信号的插槽将在发射器的线程中执行。通过排队连接连接的插槽将在接收者的线程中执行。请看这里:http ://doc.qt.nokia.com/4.7/threads-qobject.html
如果槽是直接执行的,使用[QThread object]->slot(),那么槽将在进行调用的线程中执行。
于 2011-02-19T09:39:19.077 回答
0
直接调用总是在调用线程的上下文中执行。
于 2011-02-19T09:36:05.753 回答
0
由信号调用的槽将在QObject
与其关联的线程中运行。直接调用的槽将在当前线程中运行。这是一个演示的测试程序。
输出:
main() thread: QThread(0x804d470)
run() thread: Thread(0xbff7ed94)
onRunning() direct call; thread: Thread(0xbff7ed94)
onRunning() signaled; thread: QThread(0x804d470)
测试程序:
#include <QtCore>
class Thread : public QThread
{
Q_OBJECT
public:
void run()
{
qDebug() << "run() thread:" << QThread::currentThread();
emit running();
}
public slots:
void onRunning()
{
qDebug() << "onRunning() thread:" << QThread::currentThread();
}
signals:
void running();
};
#include "threadTest.moc"
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
qDebug() << "main() thread:" << QThread::currentThread();
Thread t;
QObject::connect(&t, SIGNAL(running()), &t, SLOT(onRunning()));
t.start();
QTimer::singleShot(100, &app, SLOT(quit()));
return app.exec();
}
于 2011-02-19T20:39:46.677 回答