Qt 模板 线程

 

#include <QThread>
#include <QMutex>
#include <QMutexLocker>

 

 

 

template<class T>
class Activity : public QThread
{
public:
    typedef void (T::*CallBack)();
    Activity(T* object, CallBack method):_pObject(object), _method(method),
        _stopped(true),
        _running(false)
    {
 
    }
 
    virtual ~Activity()
    {
        stop();
        wait();
    }
 
    void start()
    {
         QMutexLocker locker(&_mutex);
         if(!_running)
         {
             try
             {
                 QThread::start();
                 _stopped = false;
                 _running = true;
             }
             catch(...)
             {
                 _running = false;
                 throw;
             }
 
         }
    }
 
    void stop()
    {
 
        _stopped = true;
        _running = false;
 
        QMutexLocker locker(&_mutex);
 
    }
 
    void wait(long milliseconds)
    {
        if(_running)
        {
            QMutexLocker locker(&_mutex);
        }
 
    }
 
    void wait()
    {
        QMutexLocker locker(&_mutex);
    }
 
    bool isStopped() const
    {
        return _stopped;
    }
 
    bool isRunning() const
    {
        return _running;
    }
 
    void msleep(unsigned long microseconds)
    {
        #ifdef Q_OS_WIN
            QThread::msleep(microseconds);
        #else
            struct timespec ts = { (microseconds/1000), (microseconds % 1000) * 1000 * 1000 };
            while(nanosleep(&ts, NULL) == -1){};
        #endif
    }
 
    void sleep(unsigned long sec)
    {
    #ifdef Q_OS_WIN
        QThread::sleep(sec);
    #else
        struct timespec ts = {(long)sec, 0 };
        while(nanosleep(&ts, NULL) == -1){};
    #endif
    }
 
protected:
    void run()
    {
        QMutexLocker locker(&_mutex);
        try
        {
            (_pObject->*_method)();
 
        }
        catch(...)
        {
            _running = false;
            throw;
        }
        _running = false;
    }
 
private:
    T* _pObject;
    CallBack _method;
 
    volatile bool _stopped;
    volatile bool _running;
 
    QMutex _mutex;
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值