【问题标题】:Implementing autosave w/o disruption实施无中断自动保存
【发布时间】:2009-03-09 17:57:37
【问题描述】:

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

但是,在测试了一段时间后,我注意到当自动保存运行时,应用程序会暂时冻结,如果您正处于笔画中间,这会很烦人。我正在想办法解决这个问题。

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

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

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

【问题讨论】:

    标签: c gtk gnome autosave


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      无论如何,我会尝试您的第一个选项。它快速、简单、中肯,我不明白为什么它不起作用。

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

      【讨论】:

      • 我想知道我是否可以做到,这样就不会有任何争用问题。据我所知,数据结构完全是链表。这可能是另一个问题的问题。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 这似乎是我已经拥有的?我不确定我是否理解您的回答。
        【解决方案5】:

        这个怎么样?

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

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

        【讨论】:

        • 这些都是有趣的想法,而且似乎与在环境中实现的内容相匹配,因为完全备份是不可行的(数据库)。我需要弄清楚输入事件是否易于序列化。
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2013-10-29
          • 2021-07-02
          • 1970-01-01
          • 2020-09-16
          • 1970-01-01
          • 1970-01-01
          • 2012-08-31
          • 1970-01-01
          • 2012-10-21
          相关资源
          最近更新 更多