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

В 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_);
}

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Из вашего фрагмента кода, я полагаю, вы хотите добавить некоторый объект синхронизации в качестве производного члена класса.Если так, то комментарий @Tas уже является ответом: объекты синхронизации концептуально не считаются частью ваших данных, поэтому просто пометьте их как изменяемые в вашем производном классе:

изменяемый QMutex cacheMutex _;

Элемент данныхпомеченный как изменяемый все еще может быть изменен в функции-члене const.

0 голосов
/ 08 марта 2019

Подробнее о QMetaObject. И всегда работать с пользовательским интерфейсом в основном потоке. Попробуйте использовать QMetaObject::invokeMethod(..., Qt::BlockingQueuedConnection), ваш метод будет выполнен в основном потоке. Так что вам не нужен мьютекс. Спасибо!

...