mythread.h
class ThreadSigSlot : public QThread
{
Q_OBJECT
public:
explicit ThreadSigSlot(QObject *parent=0):QThread(parent) {}
// 自定义槽
public slots:
virtual void writeAsync(int /*value*/) {}
// 自定义信号
signals:
void resultReady(const int& s);
};
template<typename T>
class singleThread : public ThreadSigSlot // QObject不能被多重继承
{
// Q_OBJECT不能直接用在模板里, 这里通过ThreadSigSlot间接实现信号与槽
typedef int (T::*Fun)(void);
public:
singleThread(T* parentObject, QObject* parent=0)
:ThreadSigSlot(parent)
,parentObject(parentObject)
{
connect(this, &QThread::finished, this, &QObject::deleteLater);
}
void registerFunc(Fun f) {doWork = f;}
private:
void run() Q_DECL_OVERRIDE
{
//qDebug() << QString("子线程:%1").arg( QString::number((int)QThread::currentThreadId()) );
int result;
result = (parentObject->*doWork)(); // doWork return时线程结束(一般doWork会执行一些阻塞操作)
//msleep(1000);
emit resultReady(result); // 线程结束
}
private:
T* parentObject;
Fun doWork;
};
下面是使用的例子
void MyObject::startExcelThread()
{
// singleThread<T>::run()函数是在新线程里的
m_excelThread = new singleThread<MyObject>(this/*, this*/);
//connect(m_excelThread, &singleThread<MyObject>::resultReady, this, &MyObject::handleResults); // 线程结束通知
m_excelThread->registerFunc(&MyObject::ExcelThread); // 线程入口
m_excelThread->start(); // 启动线程
qDebug() << QString("主线程:%1").arg( QString::number((int)QThread::currentThreadId()) );
}
int MyObject::ExcelThread()
{
qDebug() << QString("子线程:%1").arg( QString::number((int)QThread::currentThreadId()) );
while(1)
{
// do some........
}
return 1; // return时线程结束
}
void MyObject::OnDestroyed(QObject* /*obj*/)
{
// 关闭线程
m_excelThread->quit();
m_excelThread->wait();
}