QThread封装成模板类

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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值