当前位置: 首页 > news >正文

Windows进程的睡眠与唤醒

在总体架构庞大、包含很多进程协同工作的系统中。有时把系统内某些后台进程睡眠,待需要时再唤醒,可以节约操作系统资源,提升系统运行效率。

进程睡眠:

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);
}


http://www.mrgr.cn/news/55454.html

相关文章:

  • 基于Multisim8路彩灯循环控制电路设计与仿真
  • springboot项目多个数据源配置 dblink
  • java计算两个日期之间相差几天(小时、天)小时计算
  • nextjs中集成富文本编辑器wangEditor
  • MYSQL-查看存在的数据库语法(七)
  • CTE 与存储过程:SQL 查询简化与复杂业务逻辑处理的最佳选择
  • 洛谷刷题 P1003 [NOIP2011 提高组] 铺地毯
  • coze上构建必应搜索工作流
  • Xilinx 7系列FPGA中IDDR的介绍(一)
  • @ConditionalOnExpression条件加载Bean
  • WSL2-轻量级AI训练场景最佳生产环境
  • 前端拦截302重定向
  • Python 代码主要用于处理和分析 OpenFOAM(一种用于计算流体力学的软件)生成的数据,并提供了一些实用的工具函数。
  • HarmonyOS Next应用开发——多种方式实现图片解码
  • 【论文精读】把一切转成mesh!MeshAnything和MeshAnythingV2论文解析
  • 挖掘 M2 Pro 32G UMA 内存潜力:在 Mac 上本地运行清华大模型 ChatGLM2-6B
  • 云服务器遭受攻击后的应急响应与解决策略
  • 【前端Vue学习笔记】组件注册方式 组件传递数据 组件事件 透传 插槽slot 组件生命周期 动态组件 异步组件 依赖注入 Vue应用
  • leetcode动态规划(八)-不同的二叉搜索树
  • 生信学院|10月22日《SOLIDWORKS 自定义属性卡片应用》
  • React第十一章(useReducer)
  • 如何解决企业异地办公网络难题?
  • 持续输出面试题系列之SpringCloud篇
  • 数造科技荣获2024DAMA中国“数据治理创新奖”
  • 4.1粒子系统
  • C++游戏开发入门:用 SDL 实现你的第一个 2D 游戏