获取特定进程的线程句柄/id

Posted

技术标签:

【中文标题】获取特定进程的线程句柄/id【英文标题】:Obtain thread handles/id of a specific process 【发布时间】:2015-06-09 19:55:49 【问题描述】:

我有一个多线程嵌入式架构,其中包含 6 个特定于应用程序的进程,这些进程在执行初始化进程时执行。同样,每个线程都有自己运行的线程数。

我要做的是根据设备是否连接到电脑来暂停 1 个特定进程的正在运行的线程。

我已经尝试四处搜索,我发现最接近我正在寻找的内容如下:How to obtain list of thread handles from a win32 process?

但是,该代码返回所有正在运行的线程的列表。这对我不起作用,因为我试图暂停所有获得的线程,假设它们是从同一个进程中获得的,因此我也不检查它们属于哪个进程。

同样,我正在获取另一个进程中一个进程的运行线程列表。

Windows 中是否存在允许此类控制的现有方法,还是我不得不从整个列表中确定我需要挂起的线程?

【问题讨论】:

我想要做的是暂停正在运行的线程。 不,那是你想要做的最后一件事。阅读SuspendThread 的文档。特别是这个函数主要是为调试器设计的。它不打算用于线程同步。如果调用线程尝试获取挂起线程拥有的同步对象,则在拥有同步对象(例如互斥锁或临界区)的线程上调用 SuspendThread 可能会导致死锁。 向线程发出挂起信号. @DavidHeffernan 与使用SuspendThread 挂起线程有什么不同?我不太确定你的“给线程发信号”的意思。 你用一个事件给线程发信号。线程定期检查事件。当它被设置时,它会等到事件被取消设置。但它必须从内部完成,以便线程在安全的情况下暂停自身。只有线程才能知道。 @DavidHeffernan 这种方法的问题是我试图从进程 2 中挂起进程 1 的线程。 没关系。事件可以在进程之间共享。无论如何,你在这件事上别无选择。您无法从外部可靠地挂起线程。您需要接受这一点,然后转向合作解决方案。 【参考方案1】:

与其尝试强行挂起线程(当你在“不太幸运的时刻”挂起时,这可能会给你带来麻烦),你宁愿使用名为 CreateEvent() 并手动重置。

命名事件很容易在进程之间共享。您只需使用相同的名称再次CreateEvent()。事件的典型名称为 MyCompany_MyProduct_MyFeature_EventName 以防止意外碰撞。 当您WaitForSingleObject() 开启“设置”事件时,等待立即得到满足。 当您等待“重置”事件时,等待会暂停您的线程,直到设置事件为止。 您的第一个应用程序将使其线程在不执行任何工作时等待事件,因此可以安全地挂起。 您将从第二个应用程序设置和重置事件以控制第一个应用程序。 这样,您无需枚举线程,而且更加健壮。

【讨论】:

以上是关于获取特定进程的线程句柄/id的主要内容,如果未能解决你的问题,请参考以下文章

qt 获取句柄的线程id和进程id GetWindowThreadProcessId

qt 获取句柄的线程id和进程id GetWindowThreadProcessId

什么叫线程id号?怎么获取?

delphi 知道路径和进程如何获取窗口句柄?

c# 怎样获得想要的线程ID

C++ 获取进程句柄问题