From 3795178fe7d98490f117b981877b16c5da2e362b Mon Sep 17 00:00:00 2001 From: liulinsong Date: Thu, 11 May 2023 13:51:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9C=AC=E5=9C=B0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E7=9A=84=E5=86=99=E5=85=A5=E6=80=A7?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 因为文件IO是不靠谱的和不稳定的,所以,将本地文件的同步写入放到独立的 线程中,不再依赖于主线程,避免IO出现问题导致UI卡顿 2. 只有当上一次写入操作结束之后才会进行下一次写入操作,确保新的数据始终 能够正确覆盖旧的数据 --- kylin-virtual-keyboard.pro | 1 + src/localsettings/viewlocalsettings.cpp | 59 ++++++++++++++++++++++--- src/localsettings/viewlocalsettings.h | 16 ++++++- 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/kylin-virtual-keyboard.pro b/kylin-virtual-keyboard.pro index ee7875d..edb66ce 100644 --- a/kylin-virtual-keyboard.pro +++ b/kylin-virtual-keyboard.pro @@ -1,4 +1,5 @@ QT += quick +QT += concurrent QT += dbus QT += core gui QT += KWindowSystem diff --git a/src/localsettings/viewlocalsettings.cpp b/src/localsettings/viewlocalsettings.cpp index ce977be..83b0840 100644 --- a/src/localsettings/viewlocalsettings.cpp +++ b/src/localsettings/viewlocalsettings.cpp @@ -1,14 +1,54 @@ #include "viewlocalsettings.h" +#include +#include + +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::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); + })); } diff --git a/src/localsettings/viewlocalsettings.h b/src/localsettings/viewlocalsettings.h index 38546a6..d433f2e 100644 --- a/src/localsettings/viewlocalsettings.h +++ b/src/localsettings/viewlocalsettings.h @@ -1,11 +1,16 @@ #ifndef VIEWLOCALSETTINGS_H #define VIEWLOCALSETTINGS_H -#include +#include +#include #include "localsettings.h" class ViewLocalSettings : public LocalSettings { +public: + using SettingMap = QMap; + using GroupSettingMap = QMap; + 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 futureWatcher_; }; #endif // VIEWLOCALSETTINGS_H