本文共 1989 字,大约阅读时间需要 6 分钟。
转载自:
有时候我们需要线程执行指定的时间后, 结束它,
例如,让采集线程采集100秒的数据。
这时, 就需要在线程超过时间限制后结束它。
下面给出了Win32 console小例子, 使用VC++ 2005编译:
// main.cpp 主程序#define WIN32_LEAN_AND_MEAN#include#include 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;}