タイムアウトの終了スレッド-2つの方法


転載元:http://blog.csdn.net/blackboyofsnp/article/details/4803847
 
 
スレッドが指定された時間を実行してから終了する場合があります.
例えば、採取スレッドに100秒のデータを採取させる.
この場合は、スレッドが時間制限を超えて終了する必要があります.
以下、Win 32 consolieの小例を示し、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;
}