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