C++线程安全退出
HANDLE m_EvtThreadExit[MaxVisionNum]; //定义 方法一 for(int i=;i<MaxVisionNum;i++) m_EvtThreadExit[index] = CreateEvent(NULL,false,false,NULL); //手动创建 //线程函数 UINT CMilTestDlg::VisionThread(LPVOID param)
{
TThreadParam * pParam = (TThreadParam *)param;
CMilTestDlg * pDlg = (CMilTestDlg *)(pParam->pThis);
int visionIndex = pParam->visionIndex;
pDlg->VisionProcess(visionIndex); SetEvent(m_EvtThreadExit[index]); //线程函数最后,设置事件
return ;
} 方法二 for (int i=;i<MaxVisionNum;i++)
{
threadParma[i].pThis = this;
threadParma[i].visionIndex = i;
CWinThread *pthread = AfxBeginThread( VisionThread, &(threadParma[i]), THREAD_PRIORITY_NORMAL, ,
CREATE_SUSPENDED );
pthread->m_bAutoDelete = false; ////关闭句柄自动删除
m_EvtThreadExit[i] = pthread->m_hThread; //关联CWinThread句柄
pthread->ResumeThread(); } 方法三 for (int i=;i<MaxVisionNum;i++)
{
threadParma[i].pThis = this;
threadParma[i].visionIndex = i;
m_EvtThreadExit[i] = CreateThread(NULL,,ThreadProc,&(threadParma[i]),,NULL); //关联句柄
} DWORD WINAPI ThreadProc(LPVOID lpParam)
{
TThreadParam * pParam = (TThreadParam *)lpParam;
CMilTestDlg * pDlg = (CMilTestDlg *)(pParam->pThis);
int visionIndex = pParam->visionIndex;
pDlg->VisionProcess(visionIndex);
return ;
} /*****************************通用 **************************************/
//判断退出, void CMilTestDlg::DoEvents()
{
MSG msg;
while (::PeekMessage(&msg,NULL,,,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} void CMilTestDlg::WaitAllThreadExit(DWORD time)
{
DWORD t=::GetTickCount();
while(::GetTickCount() -t < time)
{
DoEvents(); //这个很关键,否则线程与UI相关时,会卡在里面
//线程同步的两个比较重要的函数为WaitForSingleObject()和WaitForMultipleObjects(),具体使用请参考MSDN。这两个函数都是阻塞函数,一直等待授信的对象发生才返回。
int ret = WaitForMultipleObjects(MaxVisionNum,m_EvtThreadExit,true,);
if(ret == WAIT_OBJECT_0)
{
break;
}
}
TRACE("cost (ms): %d\n",GetTickCount() - t);
}
C++线程安全退出的更多相关文章
- UNIX环境高级编程——主线程与子线程的退出关系
我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1. 主线程等待新线程先结束退出,主线程后退出.正常执行. 示例代码: #include & ...
- Qt多线程学习-用例子来理解多线程(转),这个是我看过最好的文章,总结很详细(感觉exec()的作用就是保持线程不退出,这样方便随时处理主线程发来的信号,是一种非常别致的思路)good
01 class MThread :public QThread 02 { 03 public: 04 MThread(); 05 ~MThread(); 06 virtual ...
- 关于Java线程意外退出自动重启..
最近做项目使用到第三方推送功能,然后创建了一个线程用来循环读取队列中的数据,当队列为空时,则线程暂停2秒.一切都像想象中的辣么美好.可是在后面的测试中发现收不到推送的消息了,接着发现了原来推送的线程由 ...
- 主线程用afxBeginThread()创建多个线程安全退出的办法
HANDLE hand[]; CCriticalSection m_crisecoin; CEvent m_event; struct Student { int nNO; int nYear; CW ...
- windows游戏开发中一个关于Visual Studio的编译链接成功,输出窗口却显示线程已退出。无法运行项目的问题
可能是显卡驱动程序版本太高了,退回到以前的版本就ok了. 第一次遇见这个问题可把我给整疯了!! 后来又遇到一次,参考之前的解决方法,很快就搞定了!! 可见,经验可是很重要的一个东西啊.
- C#屏蔽Alt+F4,解决Alt+F4关闭窗体时对话框NO后,线程不退出问题
//1.将窗体的属性KeyPrieview设置为true //keypreview属性为true的时候,就可以响应键盘事件v //2.在窗体KeyDown事件中加如下代码 private void F ...
- AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方
下边有个 循环调用线程写奇偶数的程序 class TheadTest { //定义一个Stream对象接收打开文件 private FileStream st; //构造方法 public Thead ...
- Linux多线程(二)(线程等待,退出)
1. 线程的等待退出 1.1. 等待线程退出 线程从入口点函数自然返回,或者主动调用pthread_exit()函数,都可以让线程正常终止 线程从入口点函数自然返回时,函数返回值可以被其它线程用pth ...
- windows主线程等待子线程退出卡死问题
在windows下调用_beginthread创建子线程并获得子线程id(函数返回值),如果子线程很快退出,在主线程中调用WaitForSingleObject等待该线程id退出,会导致主线程卡死.需 ...
随机推荐
- Linux操作系统下Oracle主要监控工具介绍
Oracle监控包括有效且完全地监控Oracle数据库的性能.可用性和使用率等统计量,还包括即时的错误通知和纠正措施,并提供全面的报表和图表.本文中主要介绍几种Linux操作系统下Oracle主要监控 ...
- webform 下使用autofac
官网介绍: http://docs.autofac.org/en/latest/integration/webforms.html#quick-start HTTP 错误 500.22 - Inter ...
- Solidworks.2016.SP5下载安装破解图文教程
安装此软件一定要断网安装!!!下载完成后解压文件,打开破解文件夹,双击文件夹中的SolidWorksSerialNumbers2016.reg进行注册表注册,如下图. 解压软件安装包(或者将软件安 ...
- Ubuntu14.04下沙盒数据导入到 Neo4j 数据库(图文详解)
不多说,直接上干货! 参考博客 http://blog.csdn.net/u012318074/article/details/72793914 (表示感谢) 前期博客 Neo4j沙盒实验申请过程 ...
- Eclipse插件Lambok,实现自动生成Java代码
1.下载Lombok.jar http://projectlombok.googlecode.com/files/lombok.jar 2.运行Lombok.jar: java -jar D:\00 ...
- Windows 10 游戏录制工具栏
- DOM相关知识点
内容待补充... DOM相关注意题目: DOM的最小组成单位叫做 //节点 Node DOM 有自己的国际标准,目前的通用版本是 //DOM 3 DOM 树的根节点 //HTML 元素 Element ...
- 由一道面试题简单扩展 — setTimeout、闭包
在一个前端公众号,看到这么一个号称简单的面试题: 1.以下程序输出什么? <script type="text/javascript"> function init() ...
- Django中ORM之操作表记录
添加表记录 添加普通字段 #方法一 book_obj = Book(title='book7',publishDate='2011-05-02',price=200,publish_id=1) boo ...
- Codeforces Round #493 (Div. 2) C. Convert to Ones 乱搞_构造_好题
题意: 给你一个长度为 nnn 的 010101串 ,你有两种操作: 1.将一个子串翻转,花费 XXX 2.将一个子串中的0变成1,1变成0,花费 YYY 求你将这个01串变成全是1的串的最少花费. ...