读书人

创建命名事件对象保证程序只能有一个实

发布时间: 2012-03-30 17:32:09 作者: rapoo

创建命名事件对象保证程序只能有一个实例运行的问题
下面连续两次运行并没有看到第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因为没有第二个程序在运行!

读书人网 >C++

热点推荐