在总体架构庞大、包含很多进程协同工作的系统中。有时把系统内某些后台进程睡眠,待需要时再唤醒,可以节约操作系统资源,提升系统运行效率。
进程睡眠:
bool Widget::suspendProcess(DWORD targetProcessId)
{// 获取进程句柄HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcessId);if (processHandle == nullptr) {std::cerr << "Failed to open process handle." << std::endl;return false;}// 创建线程快照HANDLE snapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);if (snapshotHandle == INVALID_HANDLE_VALUE) {std::cerr << "Failed to create thread snapshot." << std::endl;CloseHandle(processHandle);return false;}// 初始化THREADENTRY32结构THREADENTRY32 te32;te32.dwSize = sizeof(THREADENTRY32);// 检索快照中的第一个线程信息if (!Thread32First(snapshotHandle, &te32)) {std::cerr << "Failed to get first thread." << std::endl;CloseHandle(snapshotHandle);CloseHandle(processHandle);return false;}do {if (te32.th32OwnerProcessID == targetProcessId) {// 获取线程句柄HANDLE threadHandle = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID);if (threadHandle != nullptr) {// 挂起线程if (SuspendThread(threadHandle) == -1) {std::cerr << "Failed to suspend thread with ID " << te32.th32ThreadID << std::endl;}CloseHandle(threadHandle);}}} while (Thread32Next(snapshotHandle, &te32));// 关闭句柄CloseHandle(snapshotHandle);CloseHandle(processHandle);return true;
}
进程唤醒:
bool Widget::resumeProcess(DWORD targetProcessId)
{// 获取进程句柄HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcessId);if (processHandle == nullptr) {std::cerr << "Failed to open process handle." << std::endl;return 1;}// 创建线程快照HANDLE snapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);if (snapshotHandle == INVALID_HANDLE_VALUE) {std::cerr << "Failed to create thread snapshot." << std::endl;CloseHandle(processHandle);return 1;}// 初始化THREADENTRY32结构THREADENTRY32 te32;te32.dwSize = sizeof(THREADENTRY32);// 检索快照中的第一个线程信息if (!Thread32First(snapshotHandle, &te32)) {std::cerr << "Failed to get first thread." << std::endl;CloseHandle(snapshotHandle);CloseHandle(processHandle);return 1;}do {if (te32.th32OwnerProcessID == targetProcessId) {// 获取线程句柄HANDLE threadHandle = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID);if (threadHandle != nullptr) {// 恢复线程ResumeThread(threadHandle);CloseHandle(threadHandle);}}} while (Thread32Next(snapshotHandle, &te32));// 关闭句柄CloseHandle(snapshotHandle);CloseHandle(processHandle);
}