为什么Delphi应用程序有多个线程?

时间:2017-10-21 11:21:52

标签: multithreading delphi delphi-xe7

我已经看到我的Delphi应用程序有多个线程 - 更确切地说是7个。当然我不是在创造自己的主题,而是只使用经典的#39; VCL控制。该计划闲置。它只显示主窗体。没有对话框处于活动状态,没有运行个人/ Indy / etc线程。

  1. 我们应该只有一个线程(VCL主线程)吗?
  2. 我怎么知道这些(已经运行的线程)中的哪一个是主线程?
  3. 注1:这与Program freezes but the CPU utilization is zero
    有关 注2:我刚刚意识到这些线程中有2个或3个来自调试器(当我暂停程序并调用“CPU视图”窗口时会出现额外的线程)。

1 个答案:

答案 0 :(得分:4)

正如您在评论中看到的那样,您问题第一部分的答案很广泛。只需在Delphi XE7中创建一个新的'VCL Forms Application'项目并运行它,我在'Thread Status'视图中有4个Threads。其他人提到了TThreadedQueue,文件对话框,VCL提示代码以及更多作为未记录线程的来源。

对于你问题的第二部分,我建议在启动时命名主线程,例如:

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

正如您在评论中提到的那样,您可能无法事先为其命名,因此在现有的调试会话中,您可以临时执行此操作:

  • 调用评估/修改窗口

    • Ctrl + F7
    • 上下文菜单>调试>评估/修改
  • 键入MainThreadID作为表达式进行预测,从而生成您要查找的ID。
  • 如果需要,可以在“线程”视图中使用上下文菜单条目“名称线程”来命名具有该ID的线程。

Thread Status with names

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

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

enter image description here

虽然我为测试目的而创建的Delphi线程具有以下特征:Delphi单元可识别:

enter image description here