当前位置: 首页 > 编程日记 > 正文

C++ Windows进程管理

功能:

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

相关文章:

shell中和||的使用方法

&&运算符:command1 && command2&&左边的命令&#xff08;命令1&#xff09;返回真(即返回0&#xff0c;成功被执行&#xff09;后&#xff0c;&&右边的命令&#xff08;命令2&#xff09;才能够被执行&#xff1b;换句话说&#xff0c;“如果…

SQL中内连接、外连接、交叉连接

SQL中内连接、外连接、交叉连接 SQL连接可以分为内连接、外连接、交叉连接。 数据库数据&#xff1a; book表 stu表 1.内连接 1.1.等值连接&#xff1a;在连接条件中使用等于号()运算符比较被连接列的列值&#xff0c;其查询结果中列…

Blender从头开始装配和动画制作低多边形风格的FPS手臂

Rigging and Animating Low Poly FPS Arms in Blender MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:21节课(4h 56m) |大小解压后:3.16 GB 含课程…

Mybatis复习笔记3:映射文件详解

映射文件详解 参数处理&#xff08;#和$的区别&#xff09; #{}&#xff1a;可以获取map中的值或者实体对象属性的值&#xff1b;${}&#xff1a;可以获取map中的值或者实体对象属性的值&#xff1b; select * from person where id${id} and name#{name} # 控制台输出&…

TMS320F28335项目开发记录2_CCS与JTAG仿真器连接问题汇总

CCS与仿真器连接问题 实际使用过程中。仿真器和CCS连接可能出现这样或那样的问题&#xff0c;或许你的连接非常成功&#xff0c;没碰到过什么问题。但我的问题的确不少&#xff0c;可能与电脑配置有关吧&#xff0c;也可能与人品有关吧。 以下的自己的一些错误和解决方法总…

Mysql备份与还原及优化方法

Mysql备份一般采用mysqldump命令&#xff0c;命令形式一般如下&#xff1a;$ mysqldump –hhostname –uuser –ppassword–Pport db_name > db_name.sql默认情况下&#xff0c;不备份存储过程和函数&#xff0c;若要备份存储过程和函数&#xff0c;要加上-R选项&#xff0c…

HashTable和HashMap的区别详解

HashTable和HashMap的区别详解 一、HashMap简介 HashMap是基于哈希表实现的&#xff0c;每一个元素是一个key-value对&#xff0c;其内部通过单链表解决冲突问题&#xff0c;容量不足&#xff08;超过了阀值&#xff09;时&#xff0c;同样会自动增长。 HashMap是非线程安全的&…

Unity电子游戏优化终极指南 The Ultimate Guide to Video Game Optimisation

大小解压后&#xff1a;5.2G 含课程文件 时长9h 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 电子游戏优化终极指南 信息: 学会从你的Unity游戏开发项目中挤出每一帧表现 你会学到什么 –如何为游戏制定绩效预算并坚持下…

Mybatis复习笔记:4

关于Mybatis中的一些注意点 一.关于实体类属性 当我们封装的时候我们一般要求实体类中和数据库的列名保持一致。 如果不一致将会导致查询结果为空。 解决属性名和数据库中表的字段名不一致的方法 1.在sql语句中给数据库中的字段起别名 如&#xff1a; <select id"…

USB_HID C#测试例程

USB_HID C#测试例程 报告模式&#xff08;按键、LED、ADC&#xff09; 一、简介 Usb无处不在&#xff0c;而hid则免驱&#xff0c;使用更加方便&#xff0c;本方案主要是基于STM32F10X系列单片机的usb hid开发&#xff0c;计算机软件采用VS2013 C#开发。 二、接线图示意 三、开…

基于Linux的视频传输系统(上大学时參加的一个大赛的论文)

文件夹<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1原创性声明----------------------------------------------------32 摘要----------------------------------------------------------43系统方案---------------------…

UE5真实环境设计入门学习教程

大小解压后&#xff1a;4.69G 时长4h 30m 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 虚幻引擎5–面向初学者的真实环境设计 Unreal Engine 5 – Realistic Environment Design for Beginners 信息: 通过一步一步创建一个…

Spring复习笔记:1

ApplicationContext的三个常用实现类: ClassPathXmLApplicationContext: 它可以加载类路径下的配置文件&#xff0c;要求配置文件必须在类路径下。不在类路径的话&#xff0c;加载不了。FileSystemXmLApplicationContext: 它可以加载磁盘任意路径下的配置文件(必须有访问权限&…

Android 趣味应用—— 短信编辑器

修改短信数据库&#xff0c;从而生成任意手机号发送的短信。 AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.example.dudon.fak…

Uber体验之路

第一次听说uber&#xff0c;是2014年初的时候&#xff0c;那时候互联网热门新闻&#xff0c;经常冒出这家公司。 第一次体验uber&#xff0c;是2014.10.3&#xff0c;去机场接人&#xff0c;叫了专车。 第一次觉得uber体验好&#xff0c;是2014年感恩节的时候&#xff0c;它在深…

容器和虚拟机的对比

容器和虚拟机的对比 “敏捷”和“高性能”是容器相较于虚拟机最大的优势&#xff0c;也是它能够在 PaaS 这种更细粒度的资源管理平台上大行其道的重要原因。 不过&#xff0c;有利就有弊&#xff0c;基于 Linux Namespace 的隔离机制相比于虚拟化技术也有很多不足之处&#xff…

Spring复习笔记:2

Spring中的依赖注入 IOC的作用: 降低程序间的耦合(依赖关系) 依赖关系的管理&#xff1a; 以后都交给spring来维护&#xff0c;在当前类需要用到其他类的对象&#xff0c;由spring为我们提供&#xff0c;我们只需要在配置文件中说明依赖关系的维护&#xff0c;就称之为依赖注入…

Unity Android 2021:用C#打造3D ZigZag赛车游戏

Unity Android 2021 : Build 3D ZigZag Racing Game with C# MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:65节课(11h 7m) |大小解压后:3.6 GB …

封装了一套WeCenter的IOS SDK

度过了忙碌且迷茫的2015年&#xff0c;迎来了的郁闷且彷徨的2016年。 与哥们商量做些什么&#xff0c;谈不上创业也不是项目&#xff0c;只是想让2016年不必如2015年一样迷茫&#xff0c;也慰藉一下2016年的彷徨。 方向么&#xff0c;考察了几个行业&#xff0c;也做了些调研&a…

java多线程样例

这里我们做一个完整的样例来说明线程产生的方式不同而生成的线程的差别&#xff1a; package debug;import java.io.*;import java.lang.Thread;class MyThread extends Thread{ public int x 0; public void run(){ System.out.println(x); }}class R implements Runn…

Spring复习笔记:3

Spring基于xml的案例实践 在数据库中创建一张新的表 create table account(id int primary key auto_increment,name varchar(40),money float )character set utf8 collate utf8_general_ci;往表中导入数据 insert into account(name,money) values(aaa,1000); insert into…

Blender多米诺骨牌动画学习教程 The Impossible Domino Run in Blender

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小:8.53 GB 含课程文件 |时长:8h 20m Blender的运动跟踪&#xff0c;建模&#xff0c;渲染和合成工具集…

unity3d游戏开发猜想——当程序猿老去

程序猿将代码注入生命去打造互联网的浪潮之巅。当有一天他们老了。会走向那里&#xff0c;会做些什么&#xff1f;非常多年以后&#xff0c;在我60岁的那天早晨&#xff0c;天刚蒙蒙亮我就起床了&#xff0c;先去公园晨练&#xff0c;然后回来做早餐&#xff08;50岁的时候我学…

【JavaScript】JavaScript基础-变量、运算符与控制语句

一.变量 变量&#xff1a; 定义一个变量&#xff0c;系统会为之分配一块内存&#xff0c;程序可以用变量名来表示这块内存中的数据。 由于javascript采用的是弱类型的变量形式&#xff0c;因此&#xff0c;在声明一个变量的时候&#xff0c;我们不必声明它的类型&#xff0c;但…

ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

ROW_NUMBER() OVER()函数用法详解 &#xff08;分组排序 例子多&#xff09; https://blog.csdn.net/qq_25221835/article/details/82762416 posted on 2019-09-05 01:00 竹径风声 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/girl1314/p/11462711.html

Blender+Substance Painter全流程制作真实的机器人学习教程

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:44节课(10h 52m) |大小解压后:9.9 GB 含课程素材 如何使用Blender 2.8和Substance Painter制作真…

Spring复习笔记:4

在复习笔记三中我们进行的案例的编写&#xff0c;我们可以发现&#xff0c;就算使用了注解的方式&#xff0c;xml配置文件文件还是不能够删除&#xff0c;现在我们来将一些新的注解可以让我们去掉xml配置文件。 Configuration 作用&#xff1a;指定当前类是一个配置类 细节&a…

Extjs PROXY查询params无法传参,改用extraParams

转载于:https://www.cnblogs.com/cocoat/p/5153009.html

详解Paint的setPathEffect(PathEffect effect)

一、setPathEffect() 这个方法一看就和path有关&#xff0c;顾名思义&#xff0c;它就是给path设置样式&#xff08;效果&#xff09;的。PathEffect这个路径效果类没有具体的实现&#xff0c;效果是由它的六个子类实现的&#xff1a; 这六个子类分别可以实现不同的路径效果&am…

返回手势导致页面卡死并且UI错乱的问题解决

问题记录:在做了部分页面的转场动画之后,返回手势不灵了,快速连续返回的话会卡住,App退到后台再重新激活之后页面不卡了,但是UI错乱. 解决方案: 1. 在UINavigationController子类实现代理UIGestureRecognizerDelegate,并在viewDidLoad方法中增加代理设置: - (void)viewDidLoad …