windows线程间通信之:事件

可以描述一个资源有或没有。

// CreatEventDemo.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
#include <windows.h>


using namespace std;

DWORD WINAPI ThreadProc1(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
HANDLE hEvent = NULL;
HANDLE hThread1 = NULL;
HANDLE hThread2 = NULL;

int main(int argc,char *args[])
{
    // 使用手动重置为无信号状态,初始化时无信号状态
    hEvent = CreateEvent(NULL,
                        TRUE, // 指定将事件对象创建成手动复原(true)还是自动复原(false)
                              /* 该变量设置为true, 使用SetEvent, 信号一致有 */
                              /* 该变量设置为false, 使用SetEvent, 信号只有一次 */
                        FALSE, // 默认有无信号
                        NULL); // 事件名称

    hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc1,NULL,0,NULL);
    Sleep(200);
    hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc2,NULL,0,NULL);
    Sleep(200);
    if (NULL == hThread1 || NULL == hThread2)
    {
        cout <<"create thread fail!";
    }
    // 设置有信号,如果设置为手动复原,可以用ResetEvent设置为无信号
    SetEvent(hEvent);

    Sleep(3600*1000);
    return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
    cout <<"in thread1@!"<<endl;

    while(1)
    {
        DWORD dReturn = WaitForSingleObject(hEvent, INFINITE);
        if (WAIT_OBJECT_0 == dReturn)
        {
            cout <<" thread1 signaled ! "<<endl;
            ResetEvent(hEvent);
        }
        cout <<"in thread1 --signal"<<endl;
    }

    return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
    cout <<"in thread2@!"<<endl;

    while(1)
    {
        DWORD dReturn = WaitForSingleObject(hEvent, INFINITE);
        if (WAIT_OBJECT_0 == dReturn)
        {
            cout <<"thread2 signaled ! "<<endl;
            ResetEvent(hEvent);
        }
        cout <<"in thread2--signal"<<endl;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值