优化本地配置文件的写入性能
1. 因为文件IO是不靠谱的和不稳定的,所以,将本地文件的同步写入放到独立的 线程中,不再依赖于主线程,避免IO出现问题导致UI卡顿 2. 只有当上一次写入操作结束之后才会进行下一次写入操作,确保新的数据始终 能够正确覆盖旧的数据
This commit is contained in:
parent
081e8928a6
commit
a8b6063f9b
|
@ -1,4 +1,5 @@
|
|||
QT += quick
|
||||
QT += concurrent
|
||||
QT += dbus
|
||||
QT += core gui
|
||||
QT += KWindowSystem
|
||||
|
|
|
@ -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);
|
||||
}));
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue