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

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

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

View File

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

View File

@ -1,14 +1,54 @@
#include "viewlocalsettings.h" #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, ViewLocalSettings::ViewLocalSettings(const QString &organization,
const QString &application) 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; ViewLocalSettings::~ViewLocalSettings() = default;
QVariant QVariant
ViewLocalSettings::getValue(const QString &group, const QString &key, ViewLocalSettings::getValue(const QString &group, const QString &key,
const QVariant &defaultValue /*= QVariant()*/) { const QVariant &defaultValue /*= QVariant()*/) {
QSettings settings(organization_, application_);
settings.beginGroup(group); settings.beginGroup(group);
auto value = settings.value(key, defaultValue); 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, void ViewLocalSettings::setValue(const QString &group, const QString &key,
const QVariant &value) { const QVariant &value) {
settings.beginGroup(group); auto &settingMap = groupSettingMap_[group];
settingMap.insert(key, value);
settings.setValue(key, value); if (futureWatcher_.isFinished()) {
saveSettingsAsync();
settings.endGroup(); }
}
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 #ifndef VIEWLOCALSETTINGS_H
#define VIEWLOCALSETTINGS_H #define VIEWLOCALSETTINGS_H
#include <QSettings> #include <QFutureWatcher>
#include <QMap>
#include "localsettings.h" #include "localsettings.h"
class ViewLocalSettings : public LocalSettings { class ViewLocalSettings : public LocalSettings {
public:
using SettingMap = QMap<QString, QVariant>;
using GroupSettingMap = QMap<QString, SettingMap>;
public: public:
ViewLocalSettings(const QString &organization, const QString &application); ViewLocalSettings(const QString &organization, const QString &application);
~ViewLocalSettings() override; ~ViewLocalSettings() override;
@ -16,7 +21,14 @@ public:
const QVariant &value) override; const QVariant &value) override;
private: private:
QSettings settings; void saveSettingsAsync();
private:
const QString organization_;
const QString application_;
GroupSettingMap groupSettingMap_;
QFutureWatcher<void> futureWatcher_;
}; };
#endif // VIEWLOCALSETTINGS_H #endif // VIEWLOCALSETTINGS_H