gpt4 book ai didi

multithreading - FireDAC amBlocking与amNonBlocking命令执行

转载 作者:行者123 更新时间:2023-12-03 12:59:31 26 4
gpt4 key购买 nike

我主要在后台线程中使用FireDAC,偶尔在主GUI线程中使用。

根据文档,有4种可能的执行模式,在我看来,只有2种是合适的:

amBlocking The calling thread and GUI are blocked until an action is finished.



这是默认设置,似乎工作正常。尽管我不满意它说“并且GUI被阻止”-我不需要在后台线程完成工作的同时阻止GUI。这种破坏了线程的目的。它还可能导致非显而易见的死锁。

amNonBlocking The calling thread is blocked until an action is finished. The GUI is not blocked.



这种模式似乎更合适,因为它仅阻止调用线程,这似乎是我所需要的。但实际上,并非如此。调用有时会因异常而失败

EFDException [FireDAC][Phys][SQLite]-326. Cannot perform the action, because the previous action is in progress.



所有线程上对FireDAC的所有调用都以关键部分进行序列化-根据文档,这对于FireDAC的线程安全操作就足够了。在发布关键部分之前,所有数据集/查询均已关闭。

主要问题是,选择哪种执行模式?
子问题是-这是FireDAC中的错误,并且amNonBlocking损坏了吗?

最佳答案

如果任何人有相同的问题,解决方案如下,在对数据库进行任何操作之前,请调用:

  if GetCurrentThreadId = MainThreadID then
FDConn.ResourceOptions.CmdExecMode := amBlocking
else
FDConn.ResourceOptions.CmdExecMode := amNonBlocking;

关于multithreading - FireDAC amBlocking与amNonBlocking命令执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43546048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com