#c #qt #qt5 #qt4 #qabstractitemmodel
#c #qt #qt5 #qt4 #qabstractitemmodel
Вопрос:
В QAbstractItemModel::data(), как я могу добавить некоторые потокобезопасные данные
QAbstractItemModel:: data () — это функция ‘const’, поэтому я не могу добавить блокировку мьютекса моей области видимости, но мои данные должны быть где-то изменены, поэтому, должно быть, нужна блокировка мьютекса, как я могу решить эту проблему?
ps: Я пробовал connect / emit, но для сигнала также требуется ключевое слово ‘const’, так что мне нужно использовать сокет TCP??
QVariant data(const QModelIndex amp;index, int role = Qt::DisplayRole) const
{
QMutexLocker locker(amp;cacheMutex_);
auto cacheTime = logCache_.find(key_);
}
Комментарии:
1. Обычно делается
mutex
вот такmutable
, поскольку сам мьютекс ничего внутреннего в классе не меняет (т. Е. класс не имеет заметных изменений от храненияmutex
или нет, так что все в порядкеmutable
)2. О!!!! это работает, спасибо!!!!
Ответ №1:
Из вашего фрагмента кода я полагаю, что вы имеете в виду добавить некоторый объект синхронизации в качестве члена производного класса. Если это так, комментарий @Tas уже является ответом: объекты синхронизации концептуально не считаются частью ваших данных, поэтому просто отметьте их изменяемыми в вашем производном классе:
изменяемый QMutex cacheMutex_;
Элемент данных, помеченный как изменяемый, все еще может быть изменен в функции-члене const.
Ответ №2:
Подробнее о QMetaObject
. И всегда работать с пользовательским интерфейсом в основном потоке. Попробуйте использовать QMetaObject::invokeMethod(..., Qt::BlockingQueuedConnection)
, ваш метод будет выполнен в основном потоке. Итак, вам не нужен мьютекс. Спасибо!