获取特定进程的线程句柄/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