16,817
社区成员




#include <QObject>
#include <QThread>
#include <QDebug>
class ObjA : public QObject
{
Q_OBJECT
ObjA ()
{
/// 以下方式二选一.不要使用继承QThread重写run函数,这样你的和传统的线程一样的.函数式的线程.
//这里如果ObjA是继承自QThread,那么使用
this->moveToThread(this);
this->start();
//这里如果不是继承自QThread,而是基于QObject,那么可以这样
m_pQThread = new QThread();
this->moveToThread(m_pQThread);
m_pQThread->start();
}
public slots:
void AFun()
{
qDebug() << "AFun:" << QThread::currentThreadId ();
}
private:
QThread *m_pQThread;
}
class ObjB : public QObject
{
Q_OBJECT
public:
//在b中异步调用ObjA::AFunc();
ObjB ()
{
//首先需要有ObjA 的指针吧.
ObjA *obja = ....;
//其次,你需要有一个信号来出发ObjA里面的槽函数,因为Qt基于对象的线程是使用信号槽实现的.
connect(this, SIGNAL(DoCallAFunc()),
obja, SLOT(AFun(), Qt::QueuedConnection);
//最后调用信号触发函数.到这里,不管你是在什么地方调用的,信号,AFun()都会在它自己的线程里面被调用.
emit DoCallAFunc();
//这里可以对比一下,两个地方的线程ID肯定是不一样的.这里不能直接调用AFun();,一定要用信号触发.
qDebug() << "ObjB :" << QThread::currentThreadId ();
}
signals:
void DoCallAFunc();
public slots:
void BFun()
{
}
}