在 QAbstractItemModel::data() const 中,我如何添加一些线程安全数据
In QAbstractItemModel::data() const, how can i add some thread safe data
在 QAbstractItemModel::data() 中,我如何添加一些线程安全数据
QAbstractItemModel::data() 是一个 'const' 函数,所以我不能添加我的作用域互斥锁,但我的数据必须在某处更改,所以它必须需要一个互斥锁,怎么能我解决了这个问题?
ps:我已经试过了connect/emit,但是信号还需要'const'关键字,所以我需要使用TCP套接字吗??
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
{
QMutexLocker locker(&cacheMutex_);
auto cacheTime = logCache_.find(key_);
}
根据您的代码片段,我相信您的意思是添加一些同步对象作为派生 class 成员。如果是这样,@Tas 的评论已经是一个答案:同步对象在概念上不被视为数据的一部分,因此只需在派生的 class:
中将它们标记为可变
可变 QMutex 缓存 Mutex_;
标记为 mutable 的数据成员仍然可以在 const 成员函数中修改。
阅读有关 QMetaObject
的更多信息。并始终在主线程中使用 UI。
尝试使用QMetaObject::invokeMethod(..., Qt::BlockingQueuedConnection)
,你的方法将在主线程中执行。
所以你不需要互斥量。谢谢!
在 QAbstractItemModel::data() 中,我如何添加一些线程安全数据
QAbstractItemModel::data() 是一个 'const' 函数,所以我不能添加我的作用域互斥锁,但我的数据必须在某处更改,所以它必须需要一个互斥锁,怎么能我解决了这个问题?
ps:我已经试过了connect/emit,但是信号还需要'const'关键字,所以我需要使用TCP套接字吗??
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
{
QMutexLocker locker(&cacheMutex_);
auto cacheTime = logCache_.find(key_);
}
根据您的代码片段,我相信您的意思是添加一些同步对象作为派生 class 成员。如果是这样,@Tas 的评论已经是一个答案:同步对象在概念上不被视为数据的一部分,因此只需在派生的 class:
中将它们标记为可变可变 QMutex 缓存 Mutex_;
标记为 mutable 的数据成员仍然可以在 const 成员函数中修改。
阅读有关 QMetaObject
的更多信息。并始终在主线程中使用 UI。
尝试使用QMetaObject::invokeMethod(..., Qt::BlockingQueuedConnection)
,你的方法将在主线程中执行。
所以你不需要互斥量。谢谢!