我是否在Qt5.10中的主类或永久线程中声明了某些变量

时间:2018-02-22 13:35:56

标签: c++ multithreading qt worker

我的主要类是我的主窗口类,此时,几乎所有操作都被执行,所有相关变量都被定义。为了获得速度,我想在一个异步的永久线程(从QObject派生的工作类移动到一个线程)中外包一些计算。

一些变量(例如包含OpenCV VideoCapture设备的QList)正在两个类中使用,但在工作类中更多。

我在哪里声明这些变量?在主类中并传递对worker类或其他方式的引用?

1 个答案:

答案 0 :(得分:0)

对不起我的英语。

您可以在线程之间共享一些数据,但您必须保护对来自不同线程的数据的访问 - 请查看QMutexQReadWriteLock

错误的例子:

#include <QList>
#include <QReadWriteLock>

template< typename T >
class ThreadSafeList{
Q_DISABLE_COPY(ThreadSafeList)
public:
    ThreadSafeList():
        m_lock{},
        m_list{}
    {}
    virtual ~ThreadSafeList(){}
    const QList<T>& lockForRead() const{
        m_lock.lockForRead();
        return m_list;
    }
    QList<T>& lockForWrite(){
        m_lock.lockForWrite();
        return m_list;
    }
    //don't forget call this method after lockForRead()/lockForWrite()
    //and don't use reference to m_list after call unlock
    void unlock(){
        m_lock.unlock();
    }
private:
    mutable QReadWriteLock m_lock;
    QList<T> m_list;
};

如果您尝试使用此课程可能会遇到麻烦:

QString read(ThreadSafeList<QString>* list){
    // if list is empty, we got exception,
    // and then leave list in locked state
    // because unlock() don't called
    QString ret = list->lockForRead().first();
    list->unlock();
    return ret;
}

void write(ThreadSafeList<QString>* list, const QString& s){
    list->lockForWrite().append(s);
    //here we forget call unlock
    //and leave list in locked state
}