天天看点

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

// 所有原创文章转载请注明作者及链接

// 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;

}

下一篇: Revive