使用 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) 这样的变量,让它取消并释放自己,(同时从同一个类创建一个新实例,然后再试一次。)
- (仍在进行中……)