windows下进程单例

    xiaoxiao2021-03-25  56

    windows下进程单例

    有时候需要让进程单例执行,以防止多个实例导致异常,windows下可以使用系统事件来实现,比如Event、Mutex等,Event和Mutex在创建的时候如果对象已存在,GetLastError会返回ERROR_ALREADY_EXISTS,可以以此实现进程单例:

    1、CreateEvent方法: 原型: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes,// 安全属性,如果为空的话表示句柄不能被子进程继承,大部分情况设置为NULL即可 BOOL bManualReset,// 复位方式,TRUE表示手动SetEvent复位,FALSE表示线程结束自动复位,一般FALSE就可以 BOOL bInitialState,// 初始状态,初始为有信号还是无信号状态 LPCTSTR lpName // 对象名称,是否命名,如果设置成NULL的话就达不到进程单例的目的了 );

    代码:

    auto h = ::CreateEvent(NULL, FALSE, TRUE, _T("already running")); auto err = GetLastError(); if (err == ERROR_ALREADY_EXISTS) { MessageBox(NULL, _T("already exist"), _T("ERROR"), SW_NORMAL); return FALSE; }

    效果: 可以看到确实以单例方式运行了。 如果CreateEvent的时候创建了匿名对象(最后一个参数设置为NULL),那么就达不到单例的效果: 可以看到多个实例在运行。

    2、CreateMutex方式: 原型: HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 安全属性 BOOL bInitialOwner, // 互斥对象的所有者,TRUE表示创建之后创建线程立即拥有该Mutex LPCTSTR lpName // 对象命名,NULL为匿名 );

    代码:

    auto handle = ::CreateMutex(NULL, TRUE, _T("already_running")); auto err = GetLastError(); if (err == ERROR_ALREADY_EXISTS) { MessageBox(NULL,_T("already exist"),_T("ERROR"),SW_NORMAL); return FALSE; } if (handle) { ::ReleaseMutex(handle); }

    效果: 效果与Event方式的一样,就不上图了。

    转载请注明原文地址: https://ju.6miu.com/read-35534.html

    最新回复(0)