实施自动保存不受干扰

时间:2009-03-09 17:57:37

标签: c gtk gnome autosave

我一直在攻击Xournal的代码,以便添加自动保存功能。我最初的实施非常愚蠢:每60秒左右,做一次保存。该功能表面上有效。

然而,经过一段时间的测试后,我注意到当自动保存运行时,应用程序会暂时冻结,如果您处于笔划中间,这非常烦人。我正在试图弄清楚如何解决这个问题。

我想到的一种可能性是自动保存以检查笔在自动保存之前是否正在触摸屏幕;如果被触摸,请在笔被抬起后连接一次仅安排一秒钟的回叫。 (如果同样的事情发生,重复)。另一种可能性是充分优化保存功能,使得没有间隙(似乎不太可能)。

有人对此有任何建议吗? Xournal使用Gnome / GTK工具包,用C语言编写。

更新:我实施了反clobber逻辑,我对自动保存的粒度和性能非常满意。其中一个线程(谢天谢地)没必要!谢谢大家的建议。

6 个答案:

答案 0 :(得分:2)

如果用户界面冻结了任何明显的时间段,则可能需要单独的线程。如果您注意到UI冻结的唯一原因是因为您当时正在编写并且中断只是非常简短,那么您的方法可能会起作用。你的修复可能比创建另一个线程容易,所以先试试。

如果您最终使用线程,请使用g_threads而不是pthreads,因为您使用的是GTK +。它们会更便携。

答案 1 :(得分:1)

虽然我同意使用线程是一个“正确”的文本框答案,但并不总是你必须做的事情。如果您不小心,多线程往往会带来大量问题 - 这里的主要问题可能是在自动保存期间锁定对数据的访问。然后,如果主线程进入等待访问数据,那么您就回到了开始的位置。那么你创建一个挂起的更改或其他东西的队列,你就会忘记正在发生的事情。根据底层数据结构的复杂程度,制作副本也可以冻结主线程。

无论如何指出,我会尝试你的第一个选择。它快速,简单,重点突出,我不明白为什么它不起作用。

(注意:我没有看过Xournal的引擎盖,所以请带上一粒盐。或者是盐瓶。或者其他东西)

答案 2 :(得分:0)

您可以将自动保存功能推送到单独的线程吗?通过在第二个线程上运行,您可以与gui并行运行保存,并避免冻结窗口。

我对c的经验很少,但我认为this site可以提供帮助。

答案 3 :(得分:0)

过去我遇到过类似的情况,这就是我解决它的方式(.Net):

  1. 后台计时器以x秒间隔打勾
  2. 在勾号上,禁用计时器并处理相应的事件。
  3. 在事件处理程序中,保存并启用计时器。
  4. 我们看到的唯一缺陷实际上是在调用事件处理程序之前杀死了应用程序并且失去了1分钟的工作量。

答案 4 :(得分:0)

这个怎么样?

使用回调的想法,但除了每60秒,它还会运行每10个输入。使用基于时间的自动保存,存在一个问题,即丢失的内容量与用户工作的速度成正比。

如果您想更进一步,除了完整保存之外,还要在每次更改后将部分撤消日志保存到磁盘。这样,崩溃可能发生的最糟糕的事情就是输掉最后一次输入。

答案 5 :(得分:0)

我的重点是使用一个hipervisor线程,通过一些哈希算法比较更改事件每N秒的文件内容,然后通知父线程并回调自动保存功能。