1

Тема: Розміщення виклику збереження налаштувань в деструкторі

Розмістив функцію, що викликає збереження налаштувань програми, в деструкторі.
На Manjaro(gcc, clang) такий підхід спрацював, на Windows 11 (MSVC) — ні.
Програма написана в Qt6, використовується QSettings для налаштувань.
Чи варто так робити взагалі? Розрахунок був такий, щоб усе зберігалося автоматично при закритті програми.

2

Re: Розміщення виклику збереження налаштувань в деструкторі

Залежить від того, як саме закривається програма. Деструктор локальних змінних викликається при виході з функції, а не з програми.

Подякували: leofun011

3

Re: Розміщення виклику збереження налаштувань в деструкторі

Мається на увазі деструктор головного вікна, тобто вихід із програми при закритті останнього вікна.

4

Re: Розміщення виклику збереження налаштувань в деструкторі

Teg Miles написав:

Мається на увазі деструктор головного вікна, тобто вихід із програми при закритті останнього вікна.

І чим це допоможе, якщо, наприклад, програму вбивають з диспетчера задач?

Подякували: leofun011

5

Re: Розміщення виклику збереження налаштувань в деструкторі

Teg Miles написав:

Розмістив функцію, що викликає збереження налаштувань програми, в деструкторі.
На Manjaro(gcc, clang) такий підхід спрацював, на Windows 11 (MSVC) — ні.

Як розуміти оце ваше: "на Windows 11 (MSVC) — такий підхід не спрацював"? Програма не компілюється чи може вона форматує диск, замість збереження даних?

Teg Miles написав:

Чи варто так робити взагалі? Розрахунок був такий, щоб усе зберігалося автоматично при закритті програми.

Знову ж таки, дивлячись, які дані ви зберігаєте та в якій кількості? Як часто користувач може робити ці зміни тощо?
Якщо це не багато інформації яку необхідно зберегти, а користувач ймовірніше за все робитиме ці зміни не часто, то чому б не зберігати її одразу після того, як користувач змінив налаштування?

Сенс у відкладеному зберіганні є, якщо ви знаєте, що ймовірніше за все, користувач може часто щось оновлювати. Тому, щоб багато раз не зберігати маленькі шматочки інформації, ви чекаєте поки не накопичиться більше інформації, щоб потім залпом її зберегти за один виклик.

Подякували: leofun011

6

Re: Розміщення виклику збереження налаштувань в деструкторі

Та я готовий закластися, що він десь std::exit викликав чи аналог (скажімо, QApplication::exit), але він же не зізнається. В одній системі натискав кнопку, що закриває вікно, а в іншій - ту, що exit викликає.

7 Востаннє редагувалося steamwater (29.05.2024 17:19:09)

Re: Розміщення виклику збереження налаштувань в деструкторі

Teg Miles написав:

Розмістив функцію, що викликає збереження налаштувань програми, в деструкторі.
На Manjaro(gcc, clang) такий підхід спрацював, на Windows 11 (MSVC) — ні.
Програма написана в Qt6, використовується QSettings для налаштувань.
Чи варто так робити взагалі? Розрахунок був такий, щоб усе зберігалося автоматично при закритті програми.

Manjaro, як на мене, то цього робити не слiд. Головна причина полягає у тому, що деструктор повинен гарантувати вiдсутьнiсть будь-якої вирогiдностi генерацiї виключення. Проте, ви можете додати код у делегат евенту on_closed вашого вiкна, якщо мова про вінду.

Подякували: Teg Miles1

8

Re: Розміщення виклику збереження налаштувань в деструкторі

wander написав:
Teg Miles написав:

Розмістив функцію, що викликає збереження налаштувань програми, в деструкторі.
На Manjaro(gcc, clang) такий підхід спрацював, на Windows 11 (MSVC) — ні.

Як розуміти оце ваше: "на Windows 11 (MSVC) — такий підхід не спрацював"? Програма не компілюється чи може вона форматує диск, замість збереження даних?

Teg Miles написав:

Чи варто так робити взагалі? Розрахунок був такий, щоб усе зберігалося автоматично при закритті програми.

Знову ж таки, дивлячись, які дані ви зберігаєте та в якій кількості? Як часто користувач може робити ці зміни тощо?
Якщо це не багато інформації яку необхідно зберегти, а користувач ймовірніше за все робитиме ці зміни не часто, то чому б не зберігати її одразу після того, як користувач змінив налаштування?

Сенс у відкладеному зберіганні є, якщо ви знаєте, що ймовірніше за все, користувач може часто щось оновлювати. Тому, щоб багато раз не зберігати маленькі шматочки інформації, ви чекаєте поки не накопичиться більше інформації, щоб потім залпом її зберегти за один виклик.

Там різні налаштування зберігаються, зокрема список слів в історії пошуку.
Користувач може шукати кілька десятків (щонайбільше сотень слів) за один сеанс і тепер при кожному слові буде зберігатися.
Я хотів, щоб лише раз при закритті програми.

9

Re: Розміщення виклику збереження налаштувань в деструкторі

steamwater написав:

Розмістив функцію, що викликає збереження налаштувань програми, в деструкторі.
На Manjaro(gcc, clang) такий підхід спрацював, на Windows 11 (MSVC) — ні.
Програма написана в Qt6, використовується QSettings для налаштувань.
Чи варто так робити взагалі? Розрахунок був такий, щоб усе зберігалося автоматично при закритті програми.

Manjaro, як на мене, то цього робити не слiд. Головна причина полягає у тому, що деструктор повинен гарантувати вiдсутьнiсть будь-якої вирогiдностi генерацiї виключення. Проте, ви можете додати код у делегат евенту on_closed вашого вiкна, якщо мова про вінду.

Про on_closed не подумав, треба буде спробувати.

10

Re: Розміщення виклику збереження налаштувань в деструкторі

В деструкторі не варто (іноді і не можна): створювати нові вікна (віджети), { читати | писати } файл, виконувати важкі функції.
Якщо перед закритям вікна користувач має підтвердити щось або зберегти щось, то для цього є QWidget::closeEvent(e).

Подякували: Teg Miles1

11 Востаннє редагувалося Teg Miles (29.05.2024 22:19:55)

Re: Розміщення виклику збереження налаштувань в деструкторі

leofun01 написав:

В деструкторі не варто (іноді і не можна): створювати нові вікна (віджети), { читати | писати } файл, виконувати важкі функції.
Якщо перед закритям вікна користувач має підтвердити щось або зберегти щось, то для цього є QWidget::closeEvent(e).

Це те, що треба. Лише додати виклик функції збереження до void closeEvent(QCloseEvent *event) і все.

Подякували: leofun011