Russian Qt Forum
Ноябрь 24, 2024, 00:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Автоматическое сохранение  (Прочитано 17437 раз)
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« : Май 13, 2013, 22:02 »

Здравствуйте!
Делаю программу "менеджер электронных заметок".
Встал вопрос как лучше всего сделать автоматическое сохранение изменений.

У меня такая идея: поставить общий на всю прогу таймер сохранения
ну скажем раз в 5 минут
  • У этого таймера есть список заметок, которых нужно сохранить
  • Когда какая нибудь заметка изменяется, она сигналит об этом, таймер перехватывает ее сигнал и добавляет ее в список
  • Повторяющиеся заметки будут удалены - останется только 1 экземпляр, но останется последний добавленный
  • Когда весь список опустеет, таймер выключается
  • Когда, в отключенном состоянии, таймер отлавливает сигнал, добавляет в список заметку, испустившую сигнал и запускается
  • Когда время таймера истечет, происходит сохранение данных всех заметок в списке

Ваши идеи Улыбающийся
« Последнее редактирование: Май 13, 2013, 22:04 от gil9red » Записан

Bepec
Гость
« Ответ #1 : Май 13, 2013, 22:10 »

Стоит ли таймер запускать? Может проще сохранять при изменении? У вас явно будет не более 200 заметок (ширина экрана поделённая на строку читаемого формата, примерно). Стоит ли из-за них делать общий таймер и прочая? К тому же с таймером связана опасность не успеть сохранить при, скажем, быстром отключении питания через минуту.

Т.е. у вас полюбому будет функционал сохранения "как есть" мгновенно. Зачем тогда таймер?
Записан
Majestio
Гость
« Ответ #2 : Май 13, 2013, 22:19 »

Сохранение в момент завершения редактирования - лучший вариант. Смысла откладывать сохранение на N минут нет никакого.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Май 13, 2013, 22:21 »

У меня и так сейчас стоит сохранение при любом "чохе" Улыбающийся
при редактировании содержимого заметок, при изменении цвета, при изменении заголовка, при изменении размера, при изменении положения на экрана и т.д. и т.п.

Причем все эти сохранения идут в внешний файл. А конкретно - каждая заметка имеет собственный файл
Хочется увеличить скорость работы программы Улыбающийся

Вот и думаю, может что то с автосохранением изменений сделать )
« Последнее редактирование: Май 13, 2013, 22:47 от gil9red » Записан

Bepec
Гость
« Ответ #4 : Май 13, 2013, 22:46 »

Вы сделайте автосохранение с таймером. Таймер не на "общее сохранение", а на "3 секунды после последнего изменения".
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Май 13, 2013, 22:48 »

Т.е. после каждого изменения, создавать таймер, который эти изменения сохранит через определенный короткий промежуток времени?  Улыбающийся
Записан

Majestio
Гость
« Ответ #6 : Май 13, 2013, 23:00 »

Понятие "увеличить скорость программы" надо бы уточнить. Если речь идет о притормаживании UI во время сохранения, так делать это отдельным от GUI потоком (через тот же singleShot таймера). Если речь идет о пересчетах ... ну не знаю, реализуйте узкие части на асме ... хотя судя по специфике программы, вероятно речь идет о первом.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Май 14, 2013, 05:39 »

Ясно Улыбающийся
Я тоже подумал о QTimer::singleShot()  Улыбающийся
Записан

Bepec
Гость
« Ответ #8 : Май 14, 2013, 06:34 »

Хотя на мой взгляд у вас что-то в архитектуре наверно. Сохранение даже десятка файлов по десятку мегабайт не вызывает трудностей. Что-то у вас не чисто Показает язык
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Май 14, 2013, 06:43 »

Причем все эти сохранения идут в внешний файл. А конкретно - каждая заметка имеет собственный файл
Хочется увеличить скорость работы программы Улыбающийся
А чем вас не устраивает скорость? Даже если программа будет сохранять каждое изменение еще в 10 архивных файлах, тормозить ничего не должно. Что там за объемы, считанные байты?
Не хотите записывать каждый "чих", ждите пока пользователь перестанет вносить изменения несколько секунд и сохраняйте. Ну и конечно, не забывайте сохранить все изменения, если пользователь закрывает программу раньше.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Май 14, 2013, 16:33 »

В общем нашел ошибку и исправил Улыбающийся
С архитектурой все ок! Дело в моих кривых руках годичной давности - когда только-только начал изучать всерьез программирование Веселый

Дело в том что навесив на события изменения размера и положения на экране, сохранение соответствующих параметров подложил себе большууую свинью - сдвиг хоть на миллиметр (образно) вызывает функцию сохранения, при сдвиге на большем расстоянии - больше десятка подряд (я точно не считал) и из-за этого возникали "артефакты"

Создал таймер, который сработает 1 раз:
Код:
timerAutosavePosition = new QTimer();
timerAutosavePosition->setSingleShot(true);
timerAutosavePosition->setInterval(intervalAutosave);

connect(timerAutosavePosition, SIGNAL(timeout()),
           this, SLOT(savePosition()));

а в функциях-событиях (moveEvent и resizeEvent) вызываю нужные таймеры
Код:
timerAutosavePosition->start(); 
вызов start() без параметров сбрасывает таймер
таким образом, изменения будут сохранены только после того, как с последнего изменения пройдет intervalAutosave времени  Улыбающийся

Ну как то так Улыбающийся
Это еще только доработка  - что то мне не нравится в этом - но она уже доказала свою эффективноть  Улыбающийся
Записан

Bepec
Гость
« Ответ #11 : Май 14, 2013, 16:42 »

Это нормально.

Ненравится потому, что в промежуток таймера могут потеряться данные. Это можно исправить, если добавить приоритеты для сохранения.
Аля:
низкий приоритет - состояние окон, 10 секунд.
средний приоритет - цвет или там ещё что,  5 секунд.
высокий приоритет - сами записи, их содержимое. Незамедлительное сохранение.

PS если и потеряете, то самое ценное останется.
 
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #12 : Май 14, 2013, 16:48 »

То что вы описали, уже есть =)
Самое важное и/или мало вызываемое сразу сохраняется  Улыбающийся

Остается проблема только с сохранением текста.

У меня сохранение текста происходит в момент его изменения.
Причем сохраняется весь текст.
А т.к. используется rich text, то сам сохраняемый текст вдобавок нагружается тегами html.

Можно ли как то оптимизировать такое сохранение? Улыбающийся
Записан

Bepec
Гость
« Ответ #13 : Май 14, 2013, 17:10 »

Чесслово я не понимаю вашей проблемы Веселый

Текст < 700 символов сохраняется мгновенно. 

Неужели у вас ВОООТ такое вот полотнище заметок? В случае текстЭдита сохранение должно идти с минимальной, но задержкой. 3 секунды после последнего введённого символа хватит, я думаю.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Май 14, 2013, 19:23 »

Кто уж знает будущего пользователя  Улыбающийся
Вдруг ему вздумается все тома "войны и мира" засунуть в заметку Веселый
а из-за одного символа записывать 100500 символов... Улыбающийся
Цитировать
В случае текстЭдита сохранение должно идти с минимальной, но задержкой. 3 секунды после последнего введённого символа хватит, я думаю.

Спасибо, так и сделаю Улыбающийся
Записан

Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.