代码之家  ›  专栏  ›  技术社区  ›  valdo

是否有方法中止SQLite调用?

  •  3
  • valdo  · 技术社区  · 14 年前

    我在Windows应用程序中使用SQLite3。我有源代码(所谓的SQLite合并)。

    有时我不得不执行繁重的查询。也就是说,我打电话给 sqlite3_step

    我想知道是否有可能中止这样的呼叫。如果能在通话中进行一些背景处理,我也会很高兴 在同一线程内

    我想自己修改SQLite代码。在最简单的情况下,我可以在每次调用 ReadFile WriteFile ,并相应返回错误代码。为了允许后台处理,文件应该以重叠模式打开(这将启用异步 / ).

    有没有可能 在某些情况下,即使启用了日志,也可能使数据库处于不一致的状态吗?我想不会,因为日志文件的整个想法是为任何类型的错误做好准备的。但我想听听更多的意见。

    还有,有人试过类似的方法吗?

    提前谢谢。

    编辑:

    sqlite3_interrupt . 这可能回答了我的问题。

    现在,对于所有想知道如何(为什么)在同一个线程中的I/O期间做一些后台处理的人来说。

    不幸的是,没有多少人熟悉所谓的“重叠I/O”。

    http://en.wikipedia.org/wiki/Overlapped_I/O

    异步 未被阻止

    使用这种技术不需要创建额外的线程。事实上 创建线程的合法性是当瓶颈是计算时间(即CPU负载),并且计算机有多个CPU(或内核)时。

    创建一个线程只是为了让它大部分时间被操作系统阻塞——这没有意义。这会导致不合理地浪费操作系统资源,使程序复杂化(需要同步等)。

    不幸的是,并不是所有的库/api都允许异步操作模式,因此创建额外的线程必然是有害的。

    编辑2:

    对于那些坚持认为在“等待”I/O使用重叠I/O时“在后台”做事情是不值得的人,我不同意,我认为没有必要争论这个问题。至少这与主题无关。

    我知道创建多个线程来“并行”执行多个任务是一种“常见做法”。但这并不意味着这是一个好的做法。请允许我不要遵循“惯例”。

    2 回复  |  直到 14 年前
        1
  •  3
  •   ereOn    14 年前

    我不明白你为什么想让别人打断你 我甚至不明白这是怎么可能的:如果当前线程被阻塞,等待一些IO,你就不能执行任何其他代码。(是的,这就是“封锁”的意思)

    也许如果你能给我们更多的提示,告诉我们你为什么要这样做,我们可能会提供进一步的帮助。

    sqlite3_interrupt() 取消通话。但这显然涉及到调用是从另一个线程发出的。

        2
  •  1
  •   Eamon Nerbonne    14 年前

    SQLite is threadsafe . 在我看来,最简单的做法是在后台线程上启动Sqlite命令,并让Sqlite进行必要的锁定。

    从您的角度来看,sqlite调用看起来像一个异步的I/O位,您可以在这个线程上继续正常的处理,例如使用一个循环,包括可中断的睡眠和一些偶尔的后台处理(例如更新活动指示器)。当SQLite语句完成时,后台线程应该设置一个状态变量来指示这一点,唤醒主线程(如有必要)并终止。