В QAbstractItemModel::data () const, как я могу добавить некоторые потокобезопасные данные

#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) , ваш метод будет выполнен в основном потоке. Итак, вам не нужен мьютекс. Спасибо!