- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
看来我终于要在我的 Delphi 2009 程序中实现某种线程了。如果只有一种方法可以做到这一点,我就会逃跑。但我看到了几种可能性。
谁能解释一下它们之间有什么区别以及为什么我会选择其中一个。
Delphi 中的 TThread 类
...还有其他吗?
编辑:
我刚刚读到了 Gabr 发表在 Blaise Pascal Magazine 2010 年 3 月(第 10 期)上的一篇精彩文章。标题为“创建线程的四种方法”。您必须订阅才能获得该杂志的内容,因此根据版权,我无法在这里复制任何实质性内容。
总之,Gabr 描述了使用 TThreads、直接 Windows API 调用、Andy 的 AsyncCalls 和他自己的 OmniThreadLibrary 之间的区别。他最后得出的结论是:
"I'm not saying that you have to choose anything else than the classical Delphi way (TThread) but it is still good to be informed of options you have"
Mghie 的回答非常彻底,并表明 OmniThreadLibrary 可能更可取。但我仍然对每个人关于我(或任何人)应该如何为其应用程序选择线程方法的意见感兴趣。
您可以添加到列表中:
。 4.直接调用Windows API
。 5.Misha Charrett's CSI Distributed Application Framework正如 LachlanG 在他的回答中所建议的。
<小时/>结论:
我可能会选择 OmniThreadLibrary。我喜欢加 bool 的作品。很多年前我使用过他的分析器 GPProfile,目前我正在使用他的 GPStringHash,它实际上是 OTL 的一部分。
我唯一关心的可能是一旦 Embarcadero 将功能添加到 Delphi 中后,将其升级为支持 64 位或 Unix/Mac 处理。
最佳答案
如果您没有多线程经验,您可能不应该从 TThread
开始,因为它只是 native 线程上的一个薄层。我认为它的边缘也有点粗糙;自 Delphi 2 引入以来,它并没有发生很大的变化,主要是为了在 Kylix 时间范围内实现 Linux 兼容性,并纠正更明显的缺陷(例如修复损坏的 MREW 类,以及最终弃用 Suspend()
和 Resume()
(在最新的 Delphi 版本中)。
使用简单的线程包装类基本上也会导致开发人员将注意力集中在太低的级别上。为了正确使用多个 CPU 核心,最好将重点放在任务而不是线程上,因为线程工作的分区不能很好地适应不断变化的需求和环境 - 取决于硬件和并行运行的其他软件,最佳数量的线程数取决于硬件和其他并行运行的软件。即使在同一系统上的不同时间,线程也可能有很大差异。您仅将工作 block 传递给一个库,并自动安排它们以充分利用可用资源,这在这方面有很大帮助。
AsyncCalls 是将线程引入应用程序的良好开端。如果您的程序中有多个区域需要执行许多彼此独立的耗时步骤,那么您可以通过将每个区域传递给 AsyncCalls 来简单地异步执行它们。即使只有一个这样耗时的操作,您也可以异步执行它,并简单地在 VCL 线程中显示进度 UI,并可选择允许取消该操作。
AsyncCalls 在我看来不太适合在整个程序运行时停留的后台工作人员,并且当程序中的某些对象具有线程关联性(例如数据库连接或可能具有线程关联性的 OLE 对象)时,可能无法使用 AsyncCalls。要求所有调用都发生在同一线程中)。
您还需要注意的是,这些异步操作不是“即发即忘”类型的操作。每个重载的 AsyncCall()
函数都会返回一个 IAsyncCall
接口(interface)指针,如果您想避免阻塞,您可能需要保留对该指针的引用。如果不保留引用,那么当引用计数达到零时,接口(interface)将被释放,这将导致释放接口(interface)的线程等待异步调用完成。这是您在调试时可能会看到的情况,当退出创建 IAsyncCall
的方法时,可能会花费一段神秘的时间。
在我看来,OTL 是三个选项中最通用的一个,我会毫不犹豫地使用它。它可以做 TThread
和 AsyncCalls 可以做的一切,甚至更多。它有一个完善的设计,足够高级,既可以让用户的生活变得轻松,又可以让移植到 Unixy 系统(同时保持大部分界面完好无损)看起来至少是可能的,即使不容易。在过去的几个月里,它还开始获取一些用于并行工作的高级构造,强烈推荐。
OTL 也有几十个示例,这对于入门非常重要。 AsyncCalls 只有几行注释,但由于其功能有限(它只做一件事,但做得很好),所以很容易理解。 TThread
只有一个示例,14 年来没有真正改变,主要是一个如何不做事情的示例。
无论您选择哪个选项,没有任何库可以消除了解线程基础知识的需要。阅读一本关于这些的好书是任何成功编码的先决条件。例如,正确的锁定是所有这些的要求。
关于multithreading - 我如何在 Delphi 中进行线程处理的各种方法之间进行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3419945/
我是一名优秀的程序员,十分优秀!