使用 Indy 10 TCP 命令处理程序,每次收到命令时,我都会在数据库中插入一行,然后从数据库中读取整个故事以更新字符串网格。
我正在使用 AnyDac 数据库组件,他们的文档说“连接对象和所有与之关联的对象(如 TADQuery、TADTransaction 等)在每个时刻都必须由单个线程使用”。
如果我“缓慢”发送 TCP 命令,则没有问题。如果我“快速”发送它们(当 AnyDac 仍在显示 SQL 游标时,我会收到异常 EDatabaseError“未找到字段” - 但它当然存在。
当我收到 TCP 命令时,我的代码使用 PostMEssage 将 UM_ 发送到我的主窗体。
我认为正在发生的事情是,由于第一个 TCP 命令,主要形式是从表中读取所有行,而 TCP 命令处理程序在中途插入一个新行作为第二个命令的结果 - 因此“当我调用ADQuery1.FieldByName()
.
这听起来像问题吗?
如果是这样,我该如何预防?可以使用关键部分(在哪里,主线程?)?还是有其他方法?
[更新] 我刚刚意识到 - 这不可能是线程问题(我认为)。当我收到一个 TCP 命令时,我使用 PostMessage() 将一个 UM_ 发送到我的主窗体。因此,无论 TCP 命令来得有多快,我的主窗体一次只能通过其消息队列处理一个 UM_。TCP 命令处理程序只是发送该消息的一行 - 没有 d/b 访问。
但是 - 我不明白的是,如果在 TCP 命令之间留出“一段时间”一切都很好,但如果我“快速”发送它们,那么我会收到异常说在表的那一行中没有这样的字段。
[更新] 事实上我终于解决了,问题是使用了更新速度相当慢的 TStringGrid。有一些方法可以让它更快,但我决定将它转换为 TDbGrid,它更新速度非常快。