我有一个简单的数据类,从另一个类中调用。Qt锁定和信号
数据类:
class Data
{
public:
QString getName() const
{
return this->mName;
}
void setName(AccessData* access, const QString& name)
{
this->mName = name;
access->emitNameChanged(this);
}
private:
QString mName;
QReadWriteLock mLock;
};
而且这里是我用来获取类/设置一个新的名称,也负责处理锁定:
class AccessData : public QObject
{
public:
QString getName(Data* data)
{
QReadLocker lock(&data->mLock);
return data->getName();
}
void setName(Data* data, const QString& name)
{
QWriteLocker lock(&data->mLock);
data->setName(this, name);
}
void emitNameChanged(Data* data)
{
emit this->nameChanged(data);
}
signals:
void nameChanged(AccessData* access, Data* data);
};
什么情况是这样的: 我用的是AccessData类读取和写入数据实例的名称。 AccessData类负责锁定读/写。但是,您可以看到Data类在它的setName()方法中调用了AccessData实例,以正确发出有关更改的信号。注意:这只是伪代码,实际上它更复杂,因此Data类需要能够通过它的调用者发出信号。
而这里的问题:
说我有“数据”被称为“d”的一个实例:数据* d; 我现在使用“AccessData”实例“a”来更改名称:a-> setName(d,“new name”); 与此同时,我conncected到nameChanged()信号与此代码:
...
void nameChanged(AccessData* access, Data* data)
{
// Read the new name
QString newName = access->getName();
}
而这里的问题:
- 调用A->的setName(d, “新名字”)
- “d”现在是由“A”(写锁定)锁定
- “d”发出有关名称变化虽然仍锁定
- 我连接到nameChanged信号方法试图访问的getName信号()
- 这将导致再次发布QReadLock它只是导致死锁
我能做些什么来妥善处理这个?有这么走过来对我两件事情:
散发出延迟(又名非阻塞)的信号,让它进入循环。 这不是我想要的,因为我想要立即推送信号。
移动Data类中的锁定/解锁物件并首先解锁,然后发出信号。 这不是我想要的,因为我想让Data类完全免于锁定。
任何想法?我有一个怀念概念吗?
非常感谢 亚历
为什么你使用QReadWriteLock而不是递归QMutex? – Mat
允许多个线程同时读取 – anderswelt