multithreading - 如何在后台线程中运行数据库操作时同步 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:
第一次测试显示:
- 2x
TSimpleEvent
就足够了(1 用于 Thread + 1 用于 Gui) - 两者都创建为后台线程的公共属性
- 强制终止线程不起作用。(太多错误无法处理..)
- 最好设置一个像 (Stop_yourself) 这样的变量,让它取消并释放自己,(同时从同一个类创建一个新实例,然后再试一次。)
- (仍在进行中……)
解决方案
您应该将查询移至TThread
. 不幸的是,匿名线程在 D7 中不可用,因此您需要编写自己的TThread
派生类。在里面,你需要它自己的数据库连接来防止共享资源。在调用者方法中,您可以等待线程结束。结果应该存储在调用者类的某个地方。确保使用 TMutex 或 TMonitor 对查询参数的访问和存储查询结果的访问是线程安全的。
推荐阅读
- sql-server - 在SQL中将具有多个公共列的两个表合并为一个
- python - 在嵌套列表中查找列表的最大值
- r - 用na替换所有重复的
- node.js - mongo db data not returned in resolver function for graphql but working in routes of my nodejs server
- corda - 是否有远程停止或重新启动 Corda 节点的 RPC 操作?
- bokeh - Python Bokeh - 服务时是否可以限制 RAM 使用?
- c# - HttpClient.GetAsync 挂起,然后互联网在其执行过程中消失
- javascript - 如何处理 Chrome 网络错误?[net::ERR_CONNECTION_RESET,net::ERR_CONNECTION_REFUSED]
- sum - 将 SELECT SUM 放入 IF 语句时出错
- java - 如何在 Java、Hibernate 中修复“无法找到具有逻辑名称的列”