预备知识:事件对象的使用,互斥对象的使用,预编译指令的简单使用,这些知识可以查找其他资料学习,在这里没有介绍,查资料也是一个重要的学习过程
1、利用命名的事件对象实现运行一个实例
//利用命名的事件对象实现只有一个实例运行
#include<windows.h>
#include<iostream>
using namespace std;
HANDLE g_hEvent;
void main()
{
g_hEvent=CreateEvent(NULL,FALSE,TRUE,"RUNNING");
if(g_hEvent)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"只有一个实例可以运行"<<endl;
return;
}
else
cout<<"第一个实例开始运行,其他功能的实现"<<endl;
}
Sleep(40000);//防止主线程退出使得整个进程结束,从而防止先前的线程提前结束
}
2、利用命名的互斥对象实现一个运行实例
#include<windows.h>
#include<iostream>
using namespace std;
HANDLE m_Mutex;
void main()
{
m_Mutex=CreateMutex(NULL,FALSE,"RUNNING");
if( m_Mutex)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"只有一个实例可以运行"<<endl;
return;
}
else
cout<<"第一个实例开始运行,其他功能的实现"<<endl;
}
Sleep(40000);//防止主线程退出使得整个进程结束,从而防止先前的线程提前结束
}
3、利用编译器的功能实现
#include<windows.h>
#include<iostream>
using namespace std;
#pragma data_seg("Shared")
int volatile g_lAppInstance =0;
#pragma data_seg()
#pragma comment(linker,"/section:Shared,RWS")
void main()
{
if(++g_lAppInstance>1)
{
cout<<"已经有一个实例运行!"<<endl;
return;
}
else
cout<<"仅有一个实例运行,进行其他功能的实现"<<endl;
Sleep(40000);
}