我的主要类是我的主窗口类,此时,几乎所有操作都被执行,所有相关变量都被定义。为了获得速度,我想在一个异步的永久线程(从QObject派生的工作类移动到一个线程)中外包一些计算。
一些变量(例如包含OpenCV VideoCapture设备的QList)正在两个类中使用,但在工作类中更多。
我在哪里声明这些变量?在主类中并传递对worker类或其他方式的引用?
答案 0 :(得分:0)
对不起我的英语。
您可以在线程之间共享一些数据,但您必须保护对来自不同线程的数据的访问 - 请查看QMutex,QReadWriteLock。
错误的例子:
#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
}