gpt4 book ai didi

multithreading - 使用 Delphi 掌握多线程需要哪些核心原则?

转载 作者:行者123 更新时间:2023-12-03 14:36:11 28 4
gpt4 key购买 nike

总的来说,我对编程有点陌生(大约 8 个月,在 Delphi 中断断续续,到处都有一点 Python),我正在购买一些书籍。

我有兴趣学习并发编程和使用 Delphi 构建多线程应用程序。每当我搜索“多线程 Delphi”或“Delphi 多线程教程”时,我似乎都会得到相互矛盾的结果,因为有些东西是关于使用某些库(Omnithread 库),而其他东西似乎更适合有更多经验的程序员。

我已经研究了很多关于 Delphi 的书籍,而且在大多数情况下,它们似乎只是表面,并没有真正深入研究这个主题。我有一个程序员 friend (他使用 C++),他建议我了解使用线程时底层系统的实际情况,而不是首先跳到如何在我的程序中实际实现它们。

在 Amazon.com 上有很多关于并发编程的书籍,但似乎没有一本是用 Delphi 编写的。

基本上我需要知道在开始使用线程之前我应该​​专注于学习哪些主要内容,如果我可以/应该尝试使用不是专门针对 Delphi 开发人员的书籍来学习它们(不想让自己阅读时感到困惑)现在有一堆其他语言的代码示例的书籍),如果有任何可靠的资源/书籍,这里的任何人都可以推荐。

最佳答案

简答
转至 OmnyThreadLibrary安装它并阅读网站上的所有内容。

更长的答案
你问了一些信息,所以这里是:
这里有一些东西要阅读:

http://delphi.about.com/od/kbthread/Threading_in_Delphi.htm
我个人喜欢:Multithreading - The Delphi Way.
(它很旧,但基础知识仍然适用)

基本原理:
您的基本 VCL 应用程序是单线程的。
VCL 的构建并没有考虑到多线程,而是用 bolt 固定了线程支持,因此大多数 VCL 组件都是 不是 线程安全。
这样做的方法是让 CPU 等待,所以如果你想要一个快速的应用程序,请注意何时以及如何与 VCL 通信。

与VCL通信
您的基本线程是具有自己成员的 TThread 的继承者。
这些是每个线程变量。只要你使用这些,你就没有任何问题。
我最喜欢的与主窗口通信的方式是使用自定义窗口消息和 postmessage异步通信。
如果您想同步通信,则需要使用 临界区 synchonize方法。
参见这篇文章例如:http://edn.embarcadero.com/article/22411

线程间通信
这就是事情变得棘手的地方,因为您可能会遇到各种难以调试的同步问题。
我的建议:使用 OmnithreadLibrary ,另见此问题:Cross thread communication in Delphi
有些人会告诉你,在 x86 上读写整数是原子的,但这不是 100% 正确的,所以不要天真地使用它们,因为你很可能会弄错一些微妙的问题,最终很难调试代码。

启动和停止线程
在旧的 Delphi 版本中 Thread.suspendThread.resume已使用,但是不再推荐使用这些并且应该避免使用(在线程同步的上下文中)。
看到这个问题:With what delphi Code should I replace my calls to deprecated TThread method Suspend?
也看看这个问题,虽然答案更模糊:TThread.resume is deprecated in Delphi-2010 what should be used in place?
可以 使用 suspendresume要暂停和重新启动线程,只是不要将它们用于线程同步。

性能问题
推杆 wait_for... , synchonize线程中的 etc 代码有效地停止了线程,直到它等待的操作发生为止。
在我看来,这违背了线程的一个重要目的:速度
所以如果你想快点,你就必须要有创意。

很久以前,我写了一个名为 Life32 的应用程序。
它是 conways game of life 的显示程序.这可以非常快地生成模式(小模式每秒数百万代)。
它使用单独的线程进行计算,使用单独的线程进行显示。
显示是一个很慢的操作,不需要每一代都做。
生成线程包含显示代码 删除 来自显示器的东西(在 View 中)和显示线程简单地设置一个 bool 值,告诉生成线程也显示添加的东西。
生成代码使用 DirectX 直接写入视频内存,不需要 VCL 或 Windows 调用,也不需要任何类型的同步。
如果您移动主窗口,应用程序将继续显示在旧位置,直到您暂停生成,从而停止生成线程,此时它是 保险箱 更新线程变量。
如果线程不是 100% 同步,则显示发生太晚了,没什么大不了的。
它还具有自定义内存管理器,可避免标准内存管理器中的线程安全缓慢。
通过避免任何形式的线程同步,我能够将开销从 90%+(在较小的模式上)减少到 0。

关于multithreading - 使用 Delphi 掌握多线程需要哪些核心原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8163617/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com