【WIN32】【线程】WaitForSingleObject 函数详解

代码说明

demo很简单也很容易理解。可以使用这种方式来终止线程。看代码时你只需要关注g_hEvent 变量即可,先创建,然后让WaitForSingleObject等待这个信号的变化即可。

代码

// WaitForSingleObject.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
HANDLE g_hEvent;

DWORD WINAPI MyThreadProc1(PVOID pParam);
DWORD WINAPI MyThreadProc2(PVOID pParam);
int main()
{
	g_hEvent = NULL;
	cout << "test WaitForSingleObject" << endl;
	g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	// SetEvent(g_hEvent);
	CreateThread(NULL, 0, MyThreadProc1, NULL, 0, NULL);
	CreateThread(NULL, 0, MyThreadProc2, NULL, 0, NULL);

	system("pause");

	return 0;
}

DWORD WINAPI MyThreadProc1(PVOID pParam)
{
	static int i = 0;
	while (1)
	{
		cout << "\nMyThreadProc1 come in " << i++ << endl;
		//DWORD dwReturn = WAIT_OBJECT_0;
		DWORD dwReturn = WaitForSingleObject(g_hEvent, 2 * 1000);
		switch (dwReturn)
		{
		case WAIT_OBJECT_0:
			// hProcess所代表的进程在5秒内结束
			cout << "MyThreadProc1 >>> WAIT_OBJECT_0" << endl;
			return 0;

		case WAIT_TIMEOUT:
			// 等待时间超过5秒
			cout << "MyThreadProc1 >>> WAIT_TIMEOUT" << endl;
			break;

		case WAIT_FAILED:
			// 函数调用失败,比如传递了一个无效的句柄
			cout << "MyThreadProc1 >>> WAIT_FAILED" << endl;
			break;
		default:
			cout << "MyThreadProc1 >>> default" << endl;
		}

		cout << "MyThreadProc1 leave" << endl;
	}
	
	return 0;
}

DWORD WINAPI MyThreadProc2(PVOID pParam)
{

	cout << "\n----------------------\nMyThreadProc2 come in" << endl;
	int i = 0;
	while (i++ < 8)
	{
		cout << "MyThreadProc2:" << i << endl; 
		Sleep(1 * 1000); // 为了证明只有释放信号,线程1才能执行
	}

	//SetEvent(g_hEvent); // 释放信号
	cout << "MyThreadProc2 >>> send g_hEvent signal" << endl;
	SetEvent(g_hEvent);
	cout << "MyThreadProc2 leave\n----------------------" << endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值