博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结束超时的耗时线程 - 两种方法
阅读量:2397 次
发布时间:2019-05-10

本文共 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;}

 

 

 

 

 

你可能感兴趣的文章
SMTP验证
查看>>
POP/IMAP-before-SMTP
查看>>
Eclipse 快捷键
查看>>
怎样在同一终端上多帐号登陆同一服务器?
查看>>
BiteFight 简单外挂开发之IE篇
查看>>
SVN常用命令学习笔记
查看>>
Avoiding memory leaks
查看>>
AT Command for QOS
查看>>
关于@override报错的问题
查看>>
Linux中禁止Ctrl-Alt-Delete
查看>>
概念辨析:dBm, dBi, dBd, dB, dBc, dBuV
查看>>
麻雀虽小,五脏俱全:新新手,IP和Socket小知识
查看>>
Windows常用命令集锦
查看>>
MMS彩信是怎么炼成地(一) 编辑
查看>>
MMS是怎样炼成的(二)封装
查看>>
SMIL 参考手册
查看>>
分析pptpd程序中关于执行pptpd和pppd程序的部分源代码
查看>>
RFC 1180 - TCP/IP tutorial 学习笔记
查看>>
HOWTO: Unpack, Edit, and Re-Pack Boot Images
查看>>
ramfs, rootfs & initramfs
查看>>