Реализация автосохранения без сбоев - PullRequest
1 голос
/ 09 марта 2009

Я взломал код для Xournal, чтобы добавить функцию автосохранения. Моя первоначальная реализация была очень глупой: каждые 60 секунд делать сохранения. Функция якобы работает.

Однако после некоторого тестирования я заметил, что при запуске автосохранения приложение временно зависает, что довольно раздражает, если вы находитесь в середине хода пера. Я пытаюсь выяснить, как это исправить.

Одна возможность, о которой я подумал, заключается в том, чтобы автосохранение проверяло, касается ли перо экрана, перед автосохранением; если к нему прикоснуться, прикрепите одноразовый обратный вызов, запланированный на секунду после подъема пера. (если происходит то же самое, повторите). Другой возможностью было бы оптимизировать функцию сохранения в достаточной степени, чтобы не было пропуска (кажется маловероятным).

У кого-нибудь есть предложения по этому поводу? Xournal использует инструментарий Gnome / GTK и написан на C.

Обновление: Я реализовал логику анти-клоббера, и я очень доволен получающейся гранулярностью и производительностью автосохранения. Одна из тех времен темы (к счастью) не нужна! Спасибо всем за ваши предложения.

Ответы [ 6 ]

2 голосов
/ 09 марта 2009

Если пользовательский интерфейс зависает в течение какого-либо заметного периода времени, вероятно, стоит использовать отдельный поток. Если единственная причина, по которой вы замечаете зависание пользовательского интерфейса, заключается в том, что вы пишете в то время, а прерывание очень короткое, тогда ваш метод может работать. Ваше исправление, вероятно, намного проще, чем создание другого потока, поэтому попробуйте сначала.

Если вы в конечном итоге используете потоки, используйте g_threads вместо pthreads, поскольку вы используете GTK +. Они будут более портативными.

1 голос
/ 09 марта 2009

Хотя я бы согласился, что использование потоков - это «правильный» ответ в текстовом поле, это не всегда так, как вы должны делать. Многопоточность, как правило, приводит к возникновению множества проблем, если вы не будете осторожны - главным из них здесь, вероятно, является блокировка доступа к данным во время автосохранения. Затем, если основной поток начинает ожидание для доступа к данным, вы вернетесь туда, откуда начали. Итак, вы создаете очередь ожидающих изменений или что-то в этом роде и теряете счет того, что происходит. В зависимости от сложности базовых структур данных создание копии также может привести к зависанию основного потока.

В любом случае Я хочу попробовать ваш первый вариант. Это быстро, просто и точно, и я не понимаю, почему это не сработает.

(Примечание: я не заглядывал под капюшон Ксурнала, поэтому возьмите это с зерном соли. Или солонкой. Или что-то в этом роде)

0 голосов
/ 09 марта 2009

Моя задача - использовать поток hipervisor, сравнивающий с помощью некоторого алгоритма хеширования содержимое файла каждые N секунд при событии изменения, затем уведомлять родительский поток и вызывать функцию автосохранения.

0 голосов
/ 09 марта 2009

Как насчет этого?

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

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

0 голосов
/ 09 марта 2009

В прошлом у меня была похожая ситуация, и вот как я ее решил (.Net):

  1. Фоновый таймер тикает с интервалом x секунд
  2. На галочке отключите таймер и обработайте соответствующее событие.
  3. В обработчике событий сохраните и включите таймер.

Единственный недостаток, который мы видели на самом деле, это то, что кто-то убивал приложение до вызова обработчика событий и терял 1 минуту работы.

0 голосов
/ 09 марта 2009

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

У меня очень мало опыта работы с c, но я думаю, этот сайт может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...