首页 > 解决方案 > 如何在后台线程中运行数据库操作时同步 Delphi 事件?

问题描述

使用 Delphi 7 和 UIB,我在后台线程中运行数据库操作以消除以下问题:

我在这里阅读了所有相关主题,并意识到:使用while isMyThreadStillRuning and not UserCanceled do sleep(100); end;不是推荐的方法,而是使用TEvent.WaitFor(3000)....
这里的解决方案要么是发送信号 FROM 或TO...线程,要么是使用 messages,但绝不是两种方式。

阅读帮助文件,我也发现TSimpleEvent,似乎更容易使用。

那么在 Main-UI + DB-Thread 这两种方式之间进行通信的推荐方式是什么?

我应该简单地创建 2+2TSimpleEvent吗?

还是应该只有 1 个TEvent

更新 2:
第一次测试显示:

标签: multithreadingdelphieventsdelphi-7uib

解决方案


您应该将查询移至TThread. 不幸的是,匿名线程在 D7 中不可用,因此您需要编写自己的TThread派生类。在里面,你需要它自己的数据库连接来防止共享资源。在调用者方法中,您可以等待线程结束。结果应该存储在调用者类的某个地方。确保使用 TMutex 或 TMonitor 对查询参数的访问和存储查询结果的访问是线程安全的。


推荐阅读