// 所有原創文章轉載請注明作者及連結
// blackboycpp(AT)gmail.com
// QQ群: 135202158
有時候我們需要線程執行指定的時間後, 結束它,
例如,讓采集線程采集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;
}