HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SD
BOOL bManualReset, // (=TRUE 手动上锁),(=FALSE 自动上锁)
BOOL bInitialState, // 事件的初始状态,TRUE表示锁是开的状态
LPCTSTR lpName); // 事件名,可以用于跨进程使用
HANDLE OpenEvent(
DWORD dwDesiredAccess, // 权限
BOOL bInheritHandle, // inheritance option
LPCTSTR lpName); // 事件名字
//防止多开办法之一
if(OpenEvent() == NULL)
{
//系统没有该实例在运行,创建进程
}
else
{
return;//表示已经有实例在运行,不再创建,直接退出
}
//主线程通知子线程自动退出
DWORD WINAPI ThreadProc( lpParameter)
{
while(1)
{
DWORD bRet = WaitForSingleObject(hEvent, 0);
if(bRet == WAIT_TIMEOUT)
{
//工作代码......
//工作代码......
}
else if(bRet == WAIT_OBJECT_0)//响应主线程结束事件
{
return ;
}
}
}
int main()
{
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
hThread = CreateThread();//子线程立马开始工作
//主线程工作代码......
//主线程工作代码......
SetEvent(hEvent);//关闭线程
WaitForSingleObject(hThread, INFINIT);
}
信号灯
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, //安全属性
LONG lInitialCount,
LONG lMaximumCount,
LPCTSTR lpName ); //信号灯名字
WaitForSingleObject(hSemaphore, INFINIT);内部会对当前资源的个数进行减去1
互斥对象
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针
BOOL bInitialOwner, // 初始化互斥对象的所有者,FALSE-表示刚刚创建的这个Mutex不属于任何线程
LPCTSTR lpName);// 指向互斥对象名的指针,可以创建一个有名或无名的互斥量对象。
//与临界区用法类似,区别在于其在系统0环,可以跨进程使用
//用于有独占要求的程序 (在其进程运行期间不允许其他使用此端口设备的程序运行,或不允许同名程序运行)。
DWORD WaitForMultipleObject(
DWORD nCount, // 表示lphandles数组的元素个数
CONST HANDLE *lphandles, // 指向一个由对象handles组成的数组。
BOOL bWaitAll, // 如果为true,则表示所有的handles都必须激发,此函数才得以返回,否则,此函数将在任何一个handle激发时就返回。
DWORD dwMilliseconds); // 超时也返回,可为0,立即返回,INFINITE表示无穷等待。
WaitForMultipleObject();//允许在同一时间等待一个以上的对象。