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

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

 

你可能感兴趣的:(object,qq,null,winapi)