功能:

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 = ; 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_MUTEX ProcessMap::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_MUTEX pProc->Suspend();
} //-----------------------------------------------------------------------
void ProcessManager::Resume(Process* pProc)
{
PROCESSMANAGER_LOCK_AUTO_MUTEX pProc->Resume();
} //-----------------------------------------------------------------------
void ProcessManager::Stop(Process* pProc)
{
PROCESSMANAGER_LOCK_AUTO_MUTEX pProc->Stop();
} //-----------------------------------------------------------------------
void ProcessManager::SuspendAll()
{
PROCESSMANAGER_LOCK_AUTO_MUTEX ProcessMap::iterator i = m_Processs.begin();
for ( ; i != m_Processs.end(); ++i)
{
i->second->Suspend();
}
} //-----------------------------------------------------------------------
void ProcessManager::ResumeAll()
{
PROCESSMANAGER_LOCK_AUTO_MUTEX ProcessMap::iterator i = m_Processs.begin();
for ( ; i != m_Processs.end(); ++i)
{
i->second->Resume();
}
} //-----------------------------------------------------------------------
void ProcessManager::StopAll()
{
PROCESSMANAGER_LOCK_AUTO_MUTEX ProcessMap::iterator i = m_Processs.begin();
for ( ; i != m_Processs.end(); ++i)
{
i->second->Stop();
}
} //-----------------------------------------------------------------------
void ProcessManager::_NoifyFinished(Process* pProc)
{
PROCESSMANAGER_LOCK_AUTO_MUTEX emit _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_OBJECT friend 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_MUTEX if (m_hPId != NULL)
{
//log
m_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)
{
//log
m_pLog->LogMessage("Could not start process " + m_strName + ". System Error: " + ProcessError(), LMT_OUTBAR); //notify process manager to remove me
emit _FireFinished(this); return false;
} //log
m_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, ); return true;
} //-----------------------------------------------------------------------
void Process::Suspend()
{
PROCESS_LOCK_AUTO_MUTEX if (m_hPId == NULL) return; SuspendThread(m_hTId);
} //-----------------------------------------------------------------------
void Process::Resume()
{
PROCESS_LOCK_AUTO_MUTEX if (m_hPId == NULL) return; ResumeThread(m_hTId);
} //-----------------------------------------------------------------------
void Process::Stop()
{
PROCESS_LOCK_AUTO_MUTEX if (m_hPId == NULL) return; //Kill Listener
m_pListener->interrupt();
m_pListener->detach();
delete m_pListener;
m_pListener = NULL; //Kill Process
TerminateProcess(m_hPId, );
m_hPId = NULL;
m_hTId = NULL; //log
m_pLog->LogMessage("Process " + m_strName + " is stoped.", LMT_OUTBAR); //notify process manager to remove me
emit _FireFinished(this);
} //-----------------------------------------------------------------------
bool Process::IsRuning()
{
PROCESS_LOCK_AUTO_MUTEX if (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_MUTEX m_pListener->detach();
delete m_pListener;
m_pListener = NULL; m_hPId = NULL;
m_hTId = NULL; //log
m_pLog->LogMessage("Process " + m_strName + " is stoped.", LMT_OUTBAR); //notify process manager to remove me
emit _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, , NULL); string strError = (char*)lpMsgBuf; LocalFree(lpMsgBuf); return strError;
}

C++ Windows进程管理的更多相关文章

  1. windows 进程管理器中的内存是什么意思?

    *内存 - 工作集:私人工作集中的内存数量与进程正在使用且可以由其他进程共享的内存数量的总和. *内存 - 峰值工作集:进程所使用的工作集内存的最大数量. *内存 - 工作集增量:进程所使用的工作集内 ...

  2. 进程管理三大扩展工具htop

    三大进程管理监控工具 HTOP 介绍: Htop是一款运行于Linux系统监控与进程管理软件,htop提供所有进程的列表,并且使用彩色标识出处理器.swap和内存状态.用户一般可以在top无法提供详尽 ...

  3. 理解Docker容器的进程管理

    摘要: Docker在进程管理上有一些特殊之处,如果不注意这些细节中的魔鬼就会带来一些隐患.另外Docker鼓励"一个容器一个进程(one process per container)&qu ...

  4. windows进程/线程创建过程 --- windows操作系统学习

    有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...

  5. 初探Linux进程管理机制

    转至:http://ixdba.blog.51cto.com/2895551/543737 一 .进程的概念和分类1.进程的概念 Linux是一个多用户多任务的操作系统.多用户是指多个用户可以在同一时 ...

  6. Windows内存管理[转]

    本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...

  7. psutil--跨平台的进程管理

    原文地址:http://www.jianshu.com/p/64e265f663f6 Python处理Windows进程 psutil(Python system and process utilit ...

  8. MPICH2在两台Ubuntu上安装(用mpd做进程管理)

    本文在经过大量的实验终于不负众望成功的在两台Ubuntu 12.04上部署MPI的一个小型集群,MPICH2所用版本为mpich2-1.4.1,下载地址:http://www.mcs.anl.gov/ ...

  9. windows内存管理方式以及优缺点

    Windows内存管理方式:页式管理,段式管理,段页式管理 页式管理 将各进程的虚拟空间(逻辑地址)划分为若干个长度相等的页,业内管理把内存空间(物理内存)按照页的大小划分为片或者页面,从而实现了离散 ...

随机推荐

  1. iOS开发 iOS9横屏后状态栏隐藏处理

    - (BOOL)prefersStatusBarHidden { return NO; }

  2. tcpdump捕捉样例

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  3. angular遇到问题

    一.一个js中只有一个angunlar.module,但可以有多个controller,从而控制多个不同的作用域,每个作用域都有独立的$scope.不同作用域之间又有$rootScope这个桥梁 二. ...

  4. c#数据绑定(5)--LINQ

    嶽永鹏/文 本实例以MS AdventureWorks2008Entities数据库为基础,演示了LINQ TO ENTITY.LINQ TO ENTITYSQL和LINQ TO ENTITYCLIE ...

  5. 使用CXF发布WebService

    这里普及一下WebService和cxf的知识.关于webservice和cxf:   WebService.各种提供服务的组件     .企业总线.通讯总线(ESB)CXF:是一个SOA框架,Axi ...

  6. TransactionScope oracle不能用的问题(转载)

    报错:“无法加载oramts.dll ”的错误 参见文章:关于TransactionScope分布式事务在Oracle下的运作

  7. angularJS 2.0 开发的简单dome

    与其说这是一个demo,不如说是一个与高手的讨教过程.虽然demo出来了,可其中有些问题我还是不太明白,如果有angularjs2.0的大神,请进来指导一番,~~~~~不甚感激. 说明第一点:我采用的 ...

  8. javascript无线端的判断

    经常在工作中要求网页做这样的处理判断:针对无线端的网页,我们需要兼容一种异于PC端的网页效果. 如下代码就可以实现无线端的判断: var mobs = ['android', 'ipad', 'ipo ...

  9. winform webbrowser flash显示

    string flashSrc = "e:\\t.swf"; StringBuilder sb = new StringBuilder(); sb.Append("< ...

  10. Android Token的使用学习

    学习Token Token是什么? Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Tok ...