【发布时间】:2013-05-17 01:27:37
【问题描述】:
我要挂起(或暂停)除一个线程之外的进程。
我尝试使用 SuspendThread(Api Function),结果是进程线程变成了不负责任的状态。
这不是我想要的。我想恢复一个我必须做的主要工作的线程。
我该如何解决这个问题?请给出你的想法。
谢谢。
【问题讨论】:
我要挂起(或暂停)除一个线程之外的进程。
我尝试使用 SuspendThread(Api Function),结果是进程线程变成了不负责任的状态。
这不是我想要的。我想恢复一个我必须做的主要工作的线程。
我该如何解决这个问题?请给出你的想法。
谢谢。
【问题讨论】:
您可以调用CreateToolhelp32Snapshot 来获取属于某个进程的线程列表。获得该列表后,只需对其进行迭代并挂起与当前线程 ID 不匹配的每个线程。下面的示例未经测试,但应该可以正常工作。
#include <windows.h>
#include <tlhelp32.h>
// Pass 0 as the targetProcessId to suspend threads in the current process
void DoSuspendThread(DWORD targetProcessId, DWORD targetThreadId)
{
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (h != INVALID_HANDLE_VALUE)
{
THREADENTRY32 te;
te.dwSize = sizeof(te);
if (Thread32First(h, &te))
{
do
{
if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID))
{
// Suspend all threads EXCEPT the one we want to keep running
if(te.th32ThreadID != targetThreadId && te.th32OwnerProcessID == targetProcessId)
{
HANDLE thread = ::OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
if(thread != NULL)
{
SuspendThread(thread);
CloseHandle(thread);
}
}
}
te.dwSize = sizeof(te);
} while (Thread32Next(h, &te));
}
CloseHandle(h);
}
}
【讨论】:
CreateToolhelp32SnapShot 贴在tlhelp32.h 中。只需删除 windows.h 的包含,就可以了。如果这不能解决编译问题,您可能需要在 stdafx.h 文件中添加“tlhelp32.h”。
据我所知,您不能暂停除一个线程之外的进程...因为当进程退出时,所有线程也将退出。如果你想代替线程,你可以生成一个子进程并使用它..
【讨论】: