方法一:直接继承自QThread
1)这种方式只有重新实现的run()函数中代码是在线程中执行。
原因:因为QThread的run()函数默认开启事件循环,而我们重新实现run()函数之后,线程的事件循环将不启动。
因此当前线程类的事件和信号都会发送到主线程的事件循环处理。
实例代码:
class SubThread :public QThread
{
Q_OBJECT
public:
SubThread (){}
virtual ~SubThread (){}
protected:
virtual void run()
{
qDebug()<<"只有这里的代码是在线程中执行";
}
};
方法二:moveToThread方式
1)例如:pObj->moveToThread(pThread)
pObj对象的信号和事件都会在pThread线程中执行。
原因:因为我们在pThread->start()之后,线程会默认开启当前线程的事件循环,所以pObj的事件处理都会发送到当前线程的事件队列处理。
注意:pObj不能有父亲,否则moveToThread将失败
实例代码:
class Worker : public QObject
{
Q_OBJECT
public:
Worker(){}
virtual ~Worker(){}
public slots:
void debugWork()
{
..........
}
signals:
void sigDebug();
}
QThread *pThread = new Qthread;
Worker *pWorker = new Worker;
pWorker ->moveToThread(pThread );
QObject::connect(pWorker ,SIGNAL(sigDebug()),pWorker ,SLOT(debugWork()));
pThread ->start();
Worker类的事件处理都在pThread中处理,例如上例中的debugWork()函数。
注意:如果sigDebug在不同的线程发送,那么connect(..)时,链接方式要用队列连接
QObject::connect(pWorker ,SIGNAL(sigDebug()),pWorker ,SLOT(debugWork()),Qt::QueuedConnection);