我有一個簡單的數據類,從另一個類中調用。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