【问题标题】:Why a Delphi application has more than one thread?为什么一个 Delphi 应用程序有多个线程?
【发布时间】:2017-10-21 11:21:51
【问题描述】:

我发现我的 Delphi 应用程序有不止一个线程 - 确切地说是 7 个。当然,我不是在创建自己的线程,我只是在使用“经典”VCL 控件。程序空闲。它只显示主窗体。没有对话处于活动状态,没有个人/印地/等线程正在运行。

  1. 不应该只有一个线程(VCL 主线程)吗?
  2. 我如何知道其中哪些(已经运行的线程)是主线程?

注1:这与Program freezes but the CPU utilization is zero有关
注 2:我刚刚意识到其中 2 或 3 个线程来自调试器(当我暂停程序并调用“CPU 视图”窗口时会出现额外的线程)。

【问题讨论】:

  • 出于调试目的,您可以命名线程。
  • @nil - 我知道命名线程。但是,这对我的具体情况有何帮助?不能。
  • 那么第 2 点就是这么问的。将其命名为“主要”。有 MainThreadID 和 CurrentThread 来帮助识别。在你的程序启动期间,我猜 CurrentThread 应该是主要的。
  • 去掉不影响Q主题的部分代码/使用的组件和单元,最后给我们一个MCVE。否则我们所有的 cmets 和答案都只是猜测。
  • VCL“提示”代码也创建了一个线程。

标签: multithreading delphi delphi-xe7


【解决方案1】:

正如您在 cmets 中看到的,您问题第一部分的答案很广泛。只需在 Delphi XE7 中创建一个新的“VCL Forms Application”项目并运行它,我在“线程状态”视图中有 4 个线程。其他人提到了TThreadedQueue、文件对话框、VCL 提示代码等作为未计线程的来源。

对于您问题的第二部分,我建议在启动时将主线程命名为:

  TThread.NameThreadForDebugging('Main Thread', MainThreadID);

正如您在 cmets 中提到的,您可能无法事先命名它,因此在现有的调试会话中您可以临时命名:

  • 调用评估/修改窗口

    • Ctrl+F7
    • 上下文菜单 > 调试 > 评估/修改
  • 输入 MainThreadID 作为表达式以求值,得到您要查找的 ID。
  • 如果您愿意,可以使用“线程”视图中的上下文菜单条目“命名线程”来命名具有该 ID 的线程。

也可以使用 IDE 识别其他线程。双击线程视图中的线程将打开当前调用堆栈。略读一下,您可能已经能够判断这是本机 Delphi 线程还是外部线程。

例如,我未创建的“未识别”外部线程之一具有以下调用堆栈:

虽然我为测试目的创建了一个 Delphi 线程,但其中的 Delphi 单元是可识别的:

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多