优化本地配置文件的写入性能

1. 因为文件IO是不靠谱的和不稳定的,所以,将本地文件的同步写入放到独立的
线程中,不再依赖于主线程,避免IO出现问题导致UI卡顿

2. 只有当上一次写入操作结束之后才会进行下一次写入操作,确保新的数据始终
能够正确覆盖旧的数据
This commit is contained in:
liulinsong 2023-05-11 13:51:35 +08:00 committed by hanteng
parent 081e8928a6
commit a8b6063f9b
3 changed files with 69 additions and 7 deletions

View File

@ -1,4 +1,5 @@
QT += quick
QT += concurrent
QT += dbus
QT += core gui
QT += KWindowSystem

View File

@ -1,14 +1,54 @@
#include "viewlocalsettings.h"
#include <QSettings>
#include <QtConcurrent>
namespace {
void updateSettings(QSettings &settings,
const ViewLocalSettings::SettingMap &settingMap) {
for (auto settingIter = settingMap.constBegin();
settingIter != settingMap.constEnd(); settingIter++) {
settings.setValue(settingIter.key(), settingIter.value());
}
}
void saveSettings(const QString &organization, const QString &application,
const ViewLocalSettings::GroupSettingMap &groupSettingMap) {
QSettings settings(organization, application);
for (auto groupIter = groupSettingMap.constBegin();
groupIter != groupSettingMap.constEnd(); groupIter++) {
settings.beginGroup(groupIter.key());
updateSettings(settings, groupIter.value());
settings.endGroup();
}
settings.sync();
}
} // namespace
ViewLocalSettings::ViewLocalSettings(const QString &organization,
const QString &application)
: settings(organization, application) {}
: organization_(organization), application_(application) {
QObject::connect(&futureWatcher_, &QFutureWatcher<void>::finished,
[this]() {
if (groupSettingMap_.isEmpty()) {
return;
}
saveSettingsAsync();
});
}
ViewLocalSettings::~ViewLocalSettings() = default;
QVariant
ViewLocalSettings::getValue(const QString &group, const QString &key,
const QVariant &defaultValue /*= QVariant()*/) {
QSettings settings(organization_, application_);
settings.beginGroup(group);
auto value = settings.value(key, defaultValue);
@ -20,9 +60,18 @@ ViewLocalSettings::getValue(const QString &group, const QString &key,
void ViewLocalSettings::setValue(const QString &group, const QString &key,
const QVariant &value) {
settings.beginGroup(group);
auto &settingMap = groupSettingMap_[group];
settingMap.insert(key, value);
settings.setValue(key, value);
settings.endGroup();
if (futureWatcher_.isFinished()) {
saveSettingsAsync();
}
}
void ViewLocalSettings::saveSettingsAsync() {
auto oneshotGroupSettingMap(std::move(groupSettingMap_));
futureWatcher_.setFuture(
QtConcurrent::run([this, oneshotGroupSettingMap]() {
saveSettings(organization_, application_, oneshotGroupSettingMap);
}));
}

View File

@ -1,11 +1,16 @@
#ifndef VIEWLOCALSETTINGS_H
#define VIEWLOCALSETTINGS_H
#include <QSettings>
#include <QFutureWatcher>
#include <QMap>
#include "localsettings.h"
class ViewLocalSettings : public LocalSettings {
public:
using SettingMap = QMap<QString, QVariant>;
using GroupSettingMap = QMap<QString, SettingMap>;
public:
ViewLocalSettings(const QString &organization, const QString &application);
~ViewLocalSettings() override;
@ -16,7 +21,14 @@ public:
const QVariant &value) override;
private:
QSettings settings;
void saveSettingsAsync();
private:
const QString organization_;
const QString application_;
GroupSettingMap groupSettingMap_;
QFutureWatcher<void> futureWatcher_;
};
#endif // VIEWLOCALSETTINGS_H