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