// 所有原创文章转载请注明作者及链接
// 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;
}