结束超时的耗时线程 - 两种方法

转载自: http://blog.youkuaiyun.com/blackboyofsnp/article/details/4803847

 

 

有时候我们需要线程执行指定的时间后, 结束它,

例如,让采集线程采集100秒的数据。

这时, 就需要在线程超过时间限制后结束它。

下面给出了Win32 console小例子, 使用VC++ 2005编译:

// main.cpp 主程序
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
HANDLE  hEvent;		// 全局Event对象
HANDLE  hThread;	// 全局线程对象
bool  bFlag;	// 控制线程循环的条件
DWORD  WINAPI  FuncThreadA(LPVOID p);
DWORD  WINAPI  FuncThreadB(LPVOID p);
int    funcA(void);
int    funcB(void);
int  main(int argc, char** argv)
{
	hEvent = INVALID_HANDLE_VALUE;
	hThread = INVALID_HANDLE_VALUE;
	bFlag = false;
	// ----- 以下2段代码择一检测之 -------
	//int ret = funcA();
	//printf("funcA return: %d/n", ret);
	int ret = funcB();
	printf("funcB return: %d/n", ret);
	// ---------------------------------------
	
	if(hThread != INVALID_HANDLE_VALUE)	CloseHandle(hThread);
	if(hEvent != INVALID_HANDLE_VALUE)	CloseHandle(hEvent);
	getchar();
	return 0;
}
// funcA()在线程操作超时时, 使用Event对象结束之
int  funcA(void)
{
	hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
	DWORD  threadID;
	int value = 111;
	hThread = CreateThread(NULL, 0, FuncThreadA, (LPVOID)&value, 0, &threadID);
	DWORD  ret = WaitForSingleObject(hThread, 3000);
	if(ret ==  WAIT_OBJECT_0)
	{
		return 0;
	}
	else if(ret == WAIT_TIMEOUT)
	{
		ResetEvent(hEvent);
		return 1;
	}
	return 2;
}
// funcB()在线程操作超时时, 改变线程的循环条件bFlag结束之
int  funcB(void)
{
	DWORD  threadID;
	int value = 222;
	bFlag = true;
	hThread = CreateThread(NULL, 0, FuncThreadB, (LPVOID)&value, 0, &threadID);
	DWORD  ret = WaitForSingleObject(hThread, 3000);
	if(ret ==  WAIT_OBJECT_0)
	{
		return 0;
	}
	else if(ret == WAIT_TIMEOUT)
	{
		bFlag = false;
		return 1;
	}
	return 2;
}
// FuncThreadA()使用Event对象的信号态来控制循环
DWORD  WINAPI  FuncThreadA(LPVOID p)
{
	int value = *(int*)p;
	while(1)
	{
		DWORD ret = WaitForSingleObject(hEvent, INFINITE);
		if(ret == WAIT_OBJECT_0)
		{
			// do somethig....
			printf("-%d-/n", value);
			Sleep(100);
			SetEvent(hEvent);
		}
	}
	return 0;
}
// FuncThreadB()使用bool型的循环条件控制循环
DWORD  WINAPI  FuncThreadB(LPVOID p)
{
	int value = *(int*)p;
	while(bFlag == true)
	{
		// do somethig....
		printf("-%d-/n", value);
		Sleep(100);	
	}
	return 0;
}


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值