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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Автоматическое сохранение  (Прочитано 17442 раз)
Majestio
Гость
« Ответ #15 : Май 14, 2013, 19:36 »

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

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

Это жи монстер у тя вышел!  Смеющийся

... Может сохранение делать вот так:

QTimer::singleShot(2000,this,SLOT(SlotSuperSave()));

 Строит глазки
Записан
Bepec
Гость
« Ответ #16 : Май 14, 2013, 19:53 »

Конечно так запись выглядит проще, но непонятнее для новичков Подмигивающий
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



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

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

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

Это жи монстер у тя вышел!  Смеющийся

... Может сохранение делать вот так:

QTimer::singleShot(2000,this,SLOT(SlotSuperSave()));

 Строит глазки

А таймер QTimer::singleShot будет обновляться при его повторном вызове? )
Проверил, что нет Улыбающийся

Поэтому пусть лучше будет "монстр", но работающий Улыбающийся
Записан

Majestio
Гость
« Ответ #18 : Май 14, 2013, 20:13 »

Поэтому пусть лучше будет "монстр", но работающий Улыбающийся

Это как? В момент вызова он отрабатывает 1 раз - чере 2 сек вызовет слот.
Нужно еще сохранение - еще раз вызовешь.
Он же и есть single! - его задача активировать через n сек новый тред.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



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

В том то и дело =)
Такие вызовы его помещаются в очередь и выполнятся друг за дружком, и вызовут лаги, поэтому и был использован тот "монстр", который активировался и вызывал слот сохранения только тогда, когда с последнего изменения прошло некоторое время. Например, 1 секунда =)

Теперь никаких лагов )))
Записан

Majestio
Гость
« Ответ #20 : Май 14, 2013, 20:32 »

Теперь никаких лагов )))

Странно, а почему лаги были? Вернее в чем заключались? Если приложение в трех сторонних тредах пишет в три файла ... GUI тред же свободен во время записи?
Записан
Bepec
Гость
« Ответ #21 : Май 14, 2013, 20:39 »

Лаги при записи. Причём скорее всего сохранение идёт из ГУИ потока, что обосновано - при правильной архитектуре никаких потоков ненадо, это не особо ёмкие операции.
« Последнее редактирование: Май 14, 2013, 20:43 от Bepec » Записан
Majestio
Гость
« Ответ #22 : Май 14, 2013, 20:55 »

Лаги при записи. Причём скорее всего сохранение идёт из ГУИ потока, что обосновано - при правильной архитектуре никаких потоков ненадо, это не особо ёмкие операции.

Не согласен. Любые заметные по времени манипуляции с ресурсами крайне желательно выносить в отдельные потоки. Гуевое дело - управлять. Пусть ГУИ прогрессбар рисует какой или % записаного в статус строке обновляет, но операции кроме как отлова управления - гуй делать ниче не должен!
Записан
Bepec
Гость
« Ответ #23 : Май 14, 2013, 21:08 »

Вы, понятно дело, специалист наверняка в этой области и я боюсь даже спорить Веселый

Но... Но создание потока, синхронизация, взаимодействие всех заметок с потоком выйдет затратнее и ненадёжнее, чем простое и моментальное сохранение в основном потоке.

PS пока у многих, кто не пробовал многопоточность имеется "авторитетное" мнение, что чем больше потоков, тем лучше.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



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

Согласен =)
Потоки вещь конечно клевая, но муторная Улыбающийся
В крайнем случаи, буду функции сохранения выносить в отдельный поток через QFuture и QtConcurrent Улыбающийся
Но сомневаюсь что это пригодится Улыбающийся
Записан

Majestio
Гость
« Ответ #25 : Май 14, 2013, 21:50 »

Вы, понятно дело, специалист наверняка в этой области и я боюсь даже спорить Веселый

А зря!  Смеющийся



Но... Но создание потока, синхронизация, взаимодействие всех заметок с потоком выйдет затратнее и ненадёжнее, чем простое и моментальное сохранение в основном потоке.

"ненадёжнее" - это зависит от доверия к реализации QThread, QMutex, QMutexLocker

Если простое и моментальное - до полу секунды, согласен. А если 7 или даже 8?! Шокированный

А с таймерами что с singlShot, что с повторяемым - все равно будут засады. Таймера выполняются в том потоке, где вызваны и где есть обработка событий.

Допустим выйдет portable версия - на глухой флэшке GUI будет лагать неподецки. Выход простой - использовать  QThread::exec() для потока-сохранятеля, общую очередь того, что нужно сохранять, доступ к очереди организовать через мьютексы. Я бы сделал именно так.

Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



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

Я только учусь (с) Веселый
Записан

Bepec
Гость
« Ответ #27 : Май 14, 2013, 22:12 »

Кхм. Вообще по хорошему надо не мучаться с потоками, а писать всё в sqlite базу данных. И никаких потоков не надо и сложности не будет совершенно.
Запись за 0,00018 с вполне удовлетворяет всем требованиям.

А потоки коварны. Простейшая ошибка может выскочить через месяц или парочку. Доверие к Qt есть. Доверие к рукам, пишущим код - минимальное Подмигивающий

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

PPS ради интереса с HDD на SSD скинул двухгиговую библиотечку - время копирования 14 секунд Веселый
Записан
Majestio
Гость
« Ответ #28 : Май 14, 2013, 22:29 »

Кхм. Вообще по хорошему надо не мучаться с потоками, а писать всё в sqlite базу данных.
Вот использование БД одобрям! Это действительно и упростит и ускорит запись.

А потоки коварны. Простейшая ошибка может выскочить через месяц или парочку.

В данном случае действий минимум:

1) Запуск/остановка потока
2) Захват/отдача ресурса (вектора заданий)
3) Выполнение единичного действия в потоке

Путаться негде. Можно конечно нагромоздить по типу а-ла рандеву языка Ада ... но это будет как из миномета по колорадским жукам)

PPS ради интереса с HDD на SSD скинул двухгиговую библиотечку - время копирования 14 секунд Веселый

У меня есть флешка на 128М ... раритет! Думал у меня одного на всей планете осталась такая, а-н нет ... черз одного, двух у бухгалтерш. Жысть - она разная)
Записан
Bepec
Гость
« Ответ #29 : Май 15, 2013, 06:39 »

Как говорил один мой знакомый - не лежи впереди паровоза Веселый

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

Но так то - можно попробовать вообще сделать простейшую вещь. Поставить QDataWidgetMapper и соединить каждую заметку с базой Веселый Интересно тормозить будет?
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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