1

为了添加自动保存功能,我一直在修改 Xournal 的代码。我最初的实现非常愚蠢:每 60 秒左右进行一次保存。该功能表面上有效。

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

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

有人对此有什么建议吗?Xournal 使用 Gnome/GTK 工具包,并用 C 编写。

更新:我实现了反破坏逻辑,我对由此产生的自动保存粒度和性能非常满意。其中一个时间线程(谢天谢地)是不必要的!谢谢大家的建议。

4

6 回答 6

2

如果 UI 在任何明显的时间段内冻结,则可能要使用单独的线程。如果您注意到 UI 冻结的唯一原因是因为您当时正在写作并且中断只是非常短暂,那么您的方法可能会奏效。您的修复可能比创建另一个线程更容易,因此请先尝试。

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

于 2009-03-09T18:17:01.650 回答
1

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

无论如何,我会尝试你的第一个选择。它快速、简单、切中要害,我不明白为什么它不起作用。

(注意:我没有看过 Xournal 的引擎盖,所以把它和一粒盐一起拿。或者盐瓶。或者什么)

于 2009-03-09T18:35:24.883 回答
0

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

我对c的经验很少,但我认为这个网站可以提供帮助。

于 2009-03-09T18:03:40.123 回答
0

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

  1. 后台计时器以 x 秒为间隔计时
  2. 在滴答声上,禁用计时器并处理适当的事件。
  3. 在事件处理程序中,保存并启用计时器。

我们看到的唯一实际发生的缺陷是有人在调用事件处理程序之前杀死了应用程序并失去了 1 分钟的工作量。

于 2009-03-09T18:40:51.267 回答
0

这个怎么样?

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

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

于 2009-03-09T18:54:26.770 回答
0

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

于 2009-03-09T19:54:10.060 回答