Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何在后台线程中运行DB操作时同步Delphi事件?_Multithreading_Delphi_Events_Delphi 7_Uib - Fatal编程技术网

Multithreading 如何在后台线程中运行DB操作时同步Delphi事件?

Multithreading 如何在后台线程中运行DB操作时同步Delphi事件?,multithreading,delphi,events,delphi-7,uib,Multithreading,Delphi,Events,Delphi 7,Uib,使用Delphi 7和UIB,我在后台线程中运行数据库操作,以消除以下问题: 超时 优先事项 网络丢失后立即强制重新连接 非阻塞用户界面 保持打开的数据库连接处于活动状态 用户取消 我在这里读到了,并意识到:使用whileismythreadstillrunning而不是UserCanceled do sleep100;终止这不是推荐的方法,而是使用TEvent.WaitFor3000。。。。 这里的解决方案要么是从线程发送信号,要么是从线程发送信号,但决不是双向发送 在阅读帮助文件时,我还发现

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

超时 优先事项 网络丢失后立即强制重新连接 非阻塞用户界面 保持打开的数据库连接处于活动状态 用户取消 我在这里读到了,并意识到:使用whileismythreadstillrunning而不是UserCanceled do sleep100;终止这不是推荐的方法,而是使用TEvent.WaitFor3000。。。。 这里的解决方案要么是从线程发送信号,要么是从线程发送信号,但决不是双向发送

在阅读帮助文件时,我还发现了TSimpleEvent,它似乎更易于使用

那么,在主UI+DB线程之间以两种方式进行通信的推荐方式是什么呢

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

要启动新事务,线程应停止休眠 强制停止执行 如果移动到新阶段,则返回信号事务开始/执行/提交=完成 如果发生任何错误,则返回信号 还是应该只有一个TEvent

更新2: 初步测试表明:

2x TSimpleEvent对于线程来说足够1,对于Gui来说足够1 两者都创建为后台线程的公共属性 强制终止线程不起作用。太多无法处理的错误。。 最好自己设置一个变量,比如Stop_,让它取消并释放自己,同时从同一个类创建一个新实例并重试。 仍在进行中。。。
您应该将查询移动到一个TThread。不幸的是,D7中没有匿名线程,因此您需要编写自己的TThread派生类。在内部,您需要自己的DB连接来防止共享资源。通过调用方方法,您可以等待线程结束。结果应该存储在caller类中的某个位置。确保使用TMutex或TMonitor以线程安全的方式处理对查询参数和存储查询结果的访问

这种事件驱动的线程通信方法对我来说是新的,我不知道应该使用多少个事件以及它们的类型?减少数量和使用线程安全信号是否更快,或者CPU消耗太少,以至于与多个TSimpleEvents相比不值得这么麻烦?我认为您可能对事件有点过于着迷,最好使用一个非常简单的线程,它的执行运行一个消息循环,使用PostThreadMessage等待GUI线程发送的自定义消息-可以使用Synchonise将结果发送回GUI线程。你提到的一切都可以通过这种安排来完成。但我想您会发现,要正确执行这一点,一开始就相当困难,因此最好保持简单。看起来您正在重新创建一些数据访问组件已经支持的异步查询。@MartynA Synchronise是一种阻塞机制。事件并非如此。最后一个目标是在不阻塞数据库连接和执行阶段的情况下通知用户。@Brian实际上是的!因为我知道没有支持Firebird+D7的免费组件的工作版本。或者你能说出一些吗?另一个优点是自己编写,以尽可能少的开销实现完全控制。可悲的是,3天后,我不得不意识到这并不是那么简单,我离考试还有几天的时间。我有这样的问题:1。我应该何时重置事件&从哪个线程重置?2.什么时候会发生缠绕或错误?如何处理?3.我应该在线程内部还是外部创建事件。。。生活从来都不简单。你必须处理好一切,当然!但不仅仅是查询,TUIBDatabase+TUIBTransaction也是如此。这不是这里的问题,只是如何在两个线程之间通信。无论如何,这是一件好事,你分享给新手阅读这篇文章。同样重要的是:共享变量应该是线程安全的!您也可以通过编辑将其添加到您的帖子中。