Multithreading 在空的新VCL表单应用程序下运行哪4个线程?

Multithreading 在空的新VCL表单应用程序下运行哪4个线程?,multithreading,delphi,delphi-xe2,vcl,Multithreading,Delphi,Delphi Xe2,Vcl,可能重复: 在Delphi XE2(32位)中运行新的空VCL表单应用程序时,我看到该应用程序的任务管理器中运行了4个线程。显然,任何应用程序都至少需要1个线程,但在这种情况下,其他3个线程是什么?我想更好地了解任何VCL表单应用程序默认运行的线程。我想这可能是因为我在RAD Studio的调试模式下运行,所以我自己启动了EXE,它也运行了4个线程。我还尝试在“release”配置下编译(因此禁用编译调试信息),但仍然有4个线程 要确定线程的来源,可以使用或之类的工具检查线程的起始地址 例如

可能重复:

在Delphi XE2(32位)中运行新的空VCL表单应用程序时,我看到该应用程序的任务管理器中运行了4个线程。显然,任何应用程序都至少需要1个线程,但在这种情况下,其他3个线程是什么?我想更好地了解任何VCL表单应用程序默认运行的线程。我想这可能是因为我在RAD Studio的调试模式下运行,所以我自己启动了EXE,它也运行了4个线程。我还尝试在“release”配置下编译(因此禁用编译调试信息),但仍然有4个线程


要确定线程的来源,可以使用或之类的工具检查线程的起始地址

例如,在本例中,您可以看到

  • ntdll.dll!TpCallbackIndependent+0x?????这是Windows线程池API的一部分
  • ntdll.dll!rtlmovemory+0x?????是对WinAPi函数的调用
  • 项目???.Exe+0x?????应用程序的主线程

在我的计算机上,创建除主线程之外的所有其他线程,因为应用程序的窗口已注册,以便使用Wtsapi32.WTSRegisterSessionNotification API接收会话更改通知。您可以在Vcl.Forms->TApplication.CreateHandle过程中看到实现。这一定与您通过终端服务/远程桌面登录时应用程序的工作方式/外观有关。
其他一些线程可能存在,因为其他一些程序将代码加载到您的可执行文件中。

有趣的是,Delphi XE中只有一个线程。@RobertFrank不,不是IDE,是IDE编译的程序。它不会在后台看文件时间戳或编译东西。哦,我的错。刚刚删除了我的评论,当您删除上面的@to me时,将删除此评论!:-(没什么,只是新的应用程序,不添加任何内容就立即运行。这听起来很熟悉。事实上,我以前已经回答过:当您暂停调试器,然后打开“线程状态”视图时,您也应该在IDE中看到这一点。)。您将看到当前正在运行的所有线程。双击线程时,您将看到callstack@Lars不幸的是,Delphi IDE似乎没有解析线程堆栈中调用函数的名称,只显示内存地址。是的,你是对的,我在写这篇评论时没有运行Delphi。但是anyway+1对于您的Anwser来说,知道线程从何处开始并不是很有用。知道它们是通过调用
WTSRegisterSessionNotification
创建的是。Embarcadero的delphi团队为我命名这些愚蠢的线程将是一件好事。在每个新的Win7/64 delphi进程上都有未命名的线程是非常有用的在我看来,这太草率了。否则,他们的调试器会变得更智能,因此它知道ntdll.dll tpcallbackindependent中的开始地址等于WTSRegistersessionNotification线程,并在IDE中对它们进行适当的命名。TApplication为什么要注册此会话更改通知再次枚举Screen对象中可用的监视器。