-1

使用 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:
第一次测试显示:

  • 2xTSimpleEvent就足够了(1 用于 Thread + 1 用于 Gui)
  • 两者都创建为后台线程的公共属性
  • 强制终止线程不起作用。(太多错误无法处理..)
  • 最好设置一个像 (Stop_yourself) 这样的变量,让它取消并释放自己,(同时从同一个类创建一个新实例,然后再试一次。)
  • (仍在进行中……)
4

1 回答 1

1

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

于 2019-09-19T16:56:56.683 回答