功能:

1.各个进程启动、挂起、恢复、停止等

2.监听进程的运行状态,进程退出(正常、非正常)时,通知用户

3.异步队列

4.线程安全

进程管理器类:

#ifndef __ProcessManager_ProcessManager_H__
#define __ProcessManager_ProcessManager_H__#include "Process.h"#define PROCESSMANAGER_AUTO_MUTEX      boost::recursive_mutex PROCESSMANAGER_AUTO_MUTEX_NAME;
#define PROCESSMANAGER_LOCK_AUTO_MUTEX boost::recursive_mutex::scoped_lock AutoMutexLock(PROCESSMANAGER_AUTO_MUTEX_NAME);/** Process Manager
*/
class ProcessManager : public QObject, public Singleton<ProcessManager>
{Q_OBJECT
public:/** Default constructor.*/ProcessManager(Log* pLog);/** Default destructor.*/~ProcessManager(void);public:/** start*/Process* Start(const string& strName, const string& strCmdLine, bool bShowWnd = true);/** suspend*/void Suspend(Process* pProc);/** resume*/void Resume(Process* pProc);/** stop*/void Stop(Process* pProc);/** suspend all*/void SuspendAll();/** resume all*/void ResumeAll();/** stop all*/void StopAll();/** Override standard Singleton retrieval.*/static ProcessManager& GetSingleton(void);/** Override standard Singleton retrieval.*/static ProcessManager* GetSingletonPtr(void);protected slots:/** Notify finish*/void _NoifyFinished(Process* pProc);Q_SIGNALS:/** Fire finish*/void _FireFinished(const string&);private:typedef map<string, Process*> ProcessMap;ProcessMap m_Processs;Log*       m_pLog;PROCESSMANAGER_AUTO_MUTEX
};#endif // __ProcessManager_ProcessManager_H__

#include "ProcessManager.h"//-----------------------------------------------------------------------
template<> ProcessManager* Singleton<ProcessManager>::m_pSingleton = 0;ProcessManager* ProcessManager::GetSingletonPtr(void)
{return m_pSingleton;
}//-----------------------------------------------------------------------
ProcessManager& ProcessManager::GetSingleton(void)
{  assert(m_pSingleton); return *m_pSingleton;
}//-----------------------------------------------------------------------
ProcessManager::ProcessManager(Log* pLog)
{if (pLog == NULL){THROW_EXCEPTION("Log can not be null!", "ProcessManager");}m_pLog = pLog;
}//-----------------------------------------------------------------------
ProcessManager::~ProcessManager(void)
{StopAll();
}//-----------------------------------------------------------------------
Process* ProcessManager::Start( const string& strName, const string& strCmdLine, bool bShowWnd /*= true*/ )
{PROCESSMANAGER_LOCK_AUTO_MUTEXProcessMap::iterator i = m_Processs.find(strName);if (i != m_Processs.end()){return i->second;}else{Process* pProc = new Process(strName, m_pLog);connect(pProc, SIGNAL(_FireFinished(Process*)), this, SLOT(_NoifyFinished(Process*)), Qt::QueuedConnection);m_Processs[strName] = pProc;pProc->Start(strCmdLine, bShowWnd);return pProc;}
}//-----------------------------------------------------------------------
void ProcessManager::Suspend(Process* pProc)
{PROCESSMANAGER_LOCK_AUTO_MUTEXpProc->Suspend();
}//-----------------------------------------------------------------------
void ProcessManager::Resume(Process* pProc)
{PROCESSMANAGER_LOCK_AUTO_MUTEXpProc->Resume();
}//-----------------------------------------------------------------------
void ProcessManager::Stop(Process* pProc)
{PROCESSMANAGER_LOCK_AUTO_MUTEXpProc->Stop();
}//-----------------------------------------------------------------------
void ProcessManager::SuspendAll()
{PROCESSMANAGER_LOCK_AUTO_MUTEXProcessMap::iterator i = m_Processs.begin();for ( ; i != m_Processs.end(); ++i){i->second->Suspend();}
}//-----------------------------------------------------------------------
void ProcessManager::ResumeAll()
{PROCESSMANAGER_LOCK_AUTO_MUTEXProcessMap::iterator i = m_Processs.begin();for ( ; i != m_Processs.end(); ++i){i->second->Resume();}
}//-----------------------------------------------------------------------
void ProcessManager::StopAll()
{PROCESSMANAGER_LOCK_AUTO_MUTEXProcessMap::iterator i = m_Processs.begin();for ( ; i != m_Processs.end(); ++i){i->second->Stop();}
}//-----------------------------------------------------------------------
void ProcessManager::_NoifyFinished(Process* pProc)
{PROCESSMANAGER_LOCK_AUTO_MUTEXemit _FireFinished(pProc->GetName());ProcessMap::iterator i = m_Processs.find(pProc->GetName());if (i != m_Processs.end()){m_Processs.erase(i);}delete pProc;
}

进程类:

#ifndef __ProcessManager_Process_H__
#define __ProcessManager_Process_H__#include "PreDefine.h"#define PROCESS_AUTO_MUTEX      boost::recursive_mutex PROCESS_AUTO_MUTEX_NAME;
#define PROCESS_LOCK_AUTO_MUTEX boost::recursive_mutex::scoped_lock AutoMutexLock(PROCESS_AUTO_MUTEX_NAME);/** Process
*/
class Process : public QObject
{Q_OBJECTfriend class ProcessManager;
protected:/** Default constructor - used by ProcessManager.Warning Do not call directly*/Process(const string& strName, Log* pLog);/** Default destructor.*/~Process();public:/** start process*/bool Start(const string& strCmdLine, bool bShowWnd = true);/** suspend process*/void Suspend();/** resume process */void Resume();/** stop process*/void Stop();/** is process runing*/bool IsRuning();/** get name*/string GetName();private:/** listen to process is stoped ?*/void Listener();Q_SIGNALS:/** Fire ProcessManager this process is stoped*/void _FireFinished(Process*);protected:/* Gets the last loading error*/string ProcessError(void);private:string m_strName;Log*   m_pLog;HANDLE m_hPId;HANDLE m_hTId;boost::thread* m_pListener;PROCESS_AUTO_MUTEX
};#endif // __ProcessManager_Process_H__

#include "Process.h"//-----------------------------------------------------------------------
Process::Process(const string& strName, Log* pLog)
{if (pLog == NULL){THROW_EXCEPTION("Log can not be null!", "Process");}m_strName    = strName;m_pLog       = pLog;m_hPId       = NULL;m_hTId       = NULL;m_pListener  = NULL;
}//-----------------------------------------------------------------------
Process::~Process()
{}//-----------------------------------------------------------------------
bool Process::Start(const string& strCmdLine, bool bShowWnd /** = true */)
{PROCESS_LOCK_AUTO_MUTEXif (m_hPId != NULL) {//logm_pLog->LogMessage("Process " + m_strName + " is started.", LMT_OUTBAR);return true;}//-----------Create Process-----------
    STARTUPINFOA si;ZeroMemory(&si, sizeof(STARTUPINFOA));si.cb = sizeof(STARTUPINFOA);si.dwFlags       = STARTF_USESHOWWINDOW;si.wShowWindow = bShowWnd ? SW_SHOW : SW_HIDE;PROCESS_INFORMATION pi;ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));BOOL bSuccess = CreateProcessA(NULL, (LPSTR)(strCmdLine.c_str()), NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);if (!bSuccess) {//logm_pLog->LogMessage("Could not start process " + m_strName + ".  System Error: " + ProcessError(), LMT_OUTBAR);//notify process manager to remove meemit _FireFinished(this);return false;}//logm_pLog->LogMessage("Start process " + m_strName + " successful.", LMT_OUTBAR);m_hPId = pi.hProcess;m_hTId = pi.hThread;//-----------Listener-----------boost::function0<void> listenerFunc = boost::bind(&Process::Listener, this);m_pListener = new boost::thread(listenerFunc);//-----------Resume-----------
    ResumeThread(pi.hThread);WaitForInputIdle(pi.hProcess, 5000);return true;
}//-----------------------------------------------------------------------
void Process::Suspend()
{PROCESS_LOCK_AUTO_MUTEXif (m_hPId == NULL) return;SuspendThread(m_hTId);
}//-----------------------------------------------------------------------
void Process::Resume()
{PROCESS_LOCK_AUTO_MUTEXif (m_hPId == NULL) return;ResumeThread(m_hTId);
}//-----------------------------------------------------------------------
void Process::Stop()
{PROCESS_LOCK_AUTO_MUTEXif (m_hPId == NULL) return;//Kill Listenerm_pListener->interrupt();m_pListener->detach();delete m_pListener;m_pListener = NULL;//Kill ProcessTerminateProcess(m_hPId, 0);m_hPId = NULL;m_hTId = NULL;//logm_pLog->LogMessage("Process " + m_strName + " is stoped.", LMT_OUTBAR);//notify process manager to remove meemit _FireFinished(this);
}//-----------------------------------------------------------------------
bool Process::IsRuning()
{PROCESS_LOCK_AUTO_MUTEXif (m_hPId == NULL) return false;return true;
}//-----------------------------------------------------------------------
string Process::GetName()
{return m_strName;
}//-----------------------------------------------------------------------
void Process::Listener()
{try{WaitForSingleObject(m_hPId, INFINITE);{//local : avoid to always lock
            PROCESS_LOCK_AUTO_MUTEXm_pListener->detach();delete m_pListener;m_pListener = NULL;m_hPId = NULL;m_hTId = NULL;//logm_pLog->LogMessage("Process " + m_strName + " is stoped.", LMT_OUTBAR);//notify process manager to remove meemit _FireFinished(this);}}catch(const boost::thread_interrupted&){//interrupted
    }catch(...){//other
    }
}string Process::ProcessError( void )
{LPVOID lpMsgBuf; FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR) &lpMsgBuf, 0, NULL); string strError = (char*)lpMsgBuf;LocalFree(lpMsgBuf);return strError;
}

转载于:https://www.cnblogs.com/GuiltySpark/p/5133817.html

C++ Windows进程管理相关推荐

  1. 操作系统课设之Windows 进程管理

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  2. Windows 进程管理

    Windows 进程管理 1.问题描述 遇到的问题:4000端口被占用(福昕PDF占用4000端口号) 问题描述:启动微服务出现如下报错 Description:The Tomcat connecto ...

  3. windows进程管理问题

    Windows进程管理 Windows 所创建的每个进程都从调用CreateProcess()API函数开始, 其函数的任务是在对象管理器子系统内初始化进程对象. 每一个进程都以调用ExitProce ...

  4. 操作系统实验:Windows进程管理

    实验项目名称: Windows进程管理 一.实验目的 1.学习windows系统提供的线程创建.线程撤销.线程同步等系统调用: 2.利用C++实现线程创建.线程撤销.线程同步程序: 3.完成思考.设计 ...

  5. windows进程管理器_面向Windows,Linux,Mac ,安卓, 木马,密码破解内存提取基于KPCR结构的技术研究...

    Windows内存分析原理 内存镜像存储的是二进制数据,内存取证分析的任务就是从这些貌似毫无意义的二进制数据中找到系统的运行信息.这些二进制数据从根本上说,其来源都是操作系统的内存分配.为何分配.如何 ...

  6. 操作系统课设——Windows 进程管理

    一.实验目的 (1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序). (2)通过创建进程.观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操 ...

  7. windows进程管理器_软件进程自动重启一遍又一遍……你需要这款自动杀进程的小公举ProcessKO...

    [PConline 应用]用Windows系统最烦的一件事,就是各种乱七八糟的进程.我们知道软件要运行,就会在后台唤起进程,但这些进程有时候并不那么听话,某些软件会不断唤起进程,对此Windows自带 ...

  8. windows进程管理器_任务管理器就能搞定9成的电脑问题?方法在这里!

    90% 对于电脑的不满,都逃不出这几个方面:电脑状态无法随时监测.运行卡顿.开机时间长.莫名黑屏.电池关键时刻不扛使(笔记本电池怎么保养?能不能一直插电源充电?可以戳这里→),很多小伙伴就选择安装第三 ...

  9. windows进程管理器_系统变慢?WMI进程导致的CPU高占用解决

    我们有时会遇到系统变慢的情况,查看资源任务管理窗口发现是WMI导致的CPU高占用所致.那么,WMI究竟为何物,能否解除由它导致的CPU高占用,如何解除? 1. 查明WMI的来龙去脉 WMI是Windo ...

最新文章

  1. 在当当买了python怎么下载源代码-python爬虫爬取当当网
  2. Java DatagramSocket(UDP)要注意的问题
  3. centos7.3挂在移动硬盘(亲测)
  4. 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll
  5. ctf图片隐写之修改图片高度
  6. java(1)——用notepad++编译java(javac.exe)
  7. graalvm_GraalVM上的Picocli:极快的命令行应用程序
  8. mini2440驱动分析之ADC
  9. 简单易懂源码解析字符串拼接
  10. python为什么叫爬虫-python为什么叫网络爬虫
  11. MySQL错误Another MySQL daemon already running with the same unix socket.
  12. php 如何生成txt文件,PHP生成TXT文件
  13. VapourSynth压制教程 【Waifu2x N卡 放大教程】
  14. ONF开源白皮书:SDN解决方案案例——校园SDN
  15. 对比PAYPAL和国际信用卡支付的流程
  16. 查看linux 内核参数
  17. 注意力机制的详细理解
  18. 大数据Flink安装部署
  19. 虚拟邮箱地址-可随意接收邮箱验证码——网站
  20. yum 命令使用详解

热门文章

  1. /var/lib/docker/overlay2/xxxxx no such file or directory docker文件删除引发的问题
  2. 伍六七带你学算法 进阶篇-排序算法
  3. Go 知识点(05)— 类型别名与类型定义
  4. Cobalt Strike 的安装与简单使用
  5. SpringCloud Alibaba微服务实战(七) - 路由网关(Gateway)全局过滤
  6. nginx将泛解析的匹配域名绑定到子目录配置方法
  7. xgboost重要参数1
  8. Facebook 发布深度学习工具包 PyTorch Hub,让论文复现变得更容易
  9. Docker暴露端口服务器公网IP无法访问问题排查
  10. 2021年大数据常用语言Scala(二):Scala开发环境安装