创建命名事件对象保证程序只能有一个实例运行的问题
下面连续两次运行并没有看到第2次运行希望的输出Only one instance running ! 而是两次都输出线程中的内容 看上去象是ERROR_ALREADY_EXISTS==GetLastError()出了问题 我在ERROR_ALREADY_EXISTS==GetLastError()前面加了个‘!’就正常 为什么创建的命名事件对象存在时候GetLastError() 返回不是 ERROR_ALREADY_EXISTS
#include <iostream.h>
#include <windows.h>
DWORD WINAPI Thread1_func(
LPVOID lpParameter // thread data
);
DWORD WINAPI Thread2_func(
LPVOID lpParameter // thread data
);
HANDLE event;
int tickets=100;
void main ()
{
HANDLE thread1;
HANDLE thread2;
event=CreateEvent(NULL,FALSE,FALSE, "ticket ");
if(event)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
cout < < "Only one instance running! " < <endl;
return ;
}
}
SetEvent(event);
thread1=CreateThread(NULL,0,Thread1_func,NULL,0,NULL);
thread2=CreateThread(NULL,0,Thread2_func,NULL,0,NULL);
CloseHandle(thread1);
CloseHandle(thread2);
Sleep(2000);
CloseHandle(event);
}
DWORD WINAPI Thread1_func(
LPVOID lpParameter // thread data
)
{
while (TRUE)
{
WaitForSingleObject(event,INFINITE);
//ResetEvent(event);
if(tickets> 0)
{
Sleep(1);
cout < < "thread1 sell the tickets: " < <tickets-- < <endl;
SetEvent(event);
}
else
{
SetEvent(event);
break;
}
}
return true;
}
DWORD WINAPI Thread2_func(
LPVOID lpParameter // thread data
)
{
while (TRUE)
{
WaitForSingleObject(event,INFINITE);
//ResetEvent(event);
if(tickets> 0)
{
Sleep(1);
cout < < "thread2 sell the tickets: " < <tickets-- < <endl;
SetEvent(event);
}
else
{
SetEvent(event);
break;
}
}
return true;
}
[解决办法]
CloseHandle(thread1);
CloseHandle(thread2);
Sleep(2000);
你已经CloseHandle(event)
而且2秒之后程序就退出了,
你加上 "! "自然会输出Only one instance running因为没有第二个程序在运行!