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++线程安全退出的更多相关文章

  1. UNIX环境高级编程——主线程与子线程的退出关系

    我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1.  主线程等待新线程先结束退出,主线程后退出.正常执行. 示例代码: #include & ...

  2. Qt多线程学习-用例子来理解多线程(转),这个是我看过最好的文章,总结很详细(感觉exec()的作用就是保持线程不退出,这样方便随时处理主线程发来的信号,是一种非常别致的思路)good

    01 class MThread :public QThread 02 { 03 public: 04     MThread(); 05     ~MThread(); 06     virtual ...

  3. 关于Java线程意外退出自动重启..

    最近做项目使用到第三方推送功能,然后创建了一个线程用来循环读取队列中的数据,当队列为空时,则线程暂停2秒.一切都像想象中的辣么美好.可是在后面的测试中发现收不到推送的消息了,接着发现了原来推送的线程由 ...

  4. 主线程用afxBeginThread()创建多个线程安全退出的办法

    HANDLE hand[]; CCriticalSection m_crisecoin; CEvent m_event; struct Student { int nNO; int nYear; CW ...

  5. windows游戏开发中一个关于Visual Studio的编译链接成功,输出窗口却显示线程已退出。无法运行项目的问题

    可能是显卡驱动程序版本太高了,退回到以前的版本就ok了. 第一次遇见这个问题可把我给整疯了!! 后来又遇到一次,参考之前的解决方法,很快就搞定了!! 可见,经验可是很重要的一个东西啊.

  6. C#屏蔽Alt+F4,解决Alt+F4关闭窗体时对话框NO后,线程不退出问题

    //1.将窗体的属性KeyPrieview设置为true //keypreview属性为true的时候,就可以响应键盘事件v //2.在窗体KeyDown事件中加如下代码 private void F ...

  7. AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方

    下边有个 循环调用线程写奇偶数的程序 class TheadTest { //定义一个Stream对象接收打开文件 private FileStream st; //构造方法 public Thead ...

  8. Linux多线程(二)(线程等待,退出)

    1. 线程的等待退出 1.1. 等待线程退出 线程从入口点函数自然返回,或者主动调用pthread_exit()函数,都可以让线程正常终止 线程从入口点函数自然返回时,函数返回值可以被其它线程用pth ...

  9. windows主线程等待子线程退出卡死问题

    在windows下调用_beginthread创建子线程并获得子线程id(函数返回值),如果子线程很快退出,在主线程中调用WaitForSingleObject等待该线程id退出,会导致主线程卡死.需 ...

随机推荐

  1. SYN-Flood防御方法之一Synproxy

    SYN-Flood攻击: 攻击者发送大量的SYN给服务器. 服务器必须针对每一个SYN请求回送一个SYN-ACK 应答包,此时服务器就必须保持一条半开放的连接,直到接收到一个对应的ACK应答包为止. ...

  2. sql获得某个时间段的数据

    CONVERT(Date, 时间字符串变量 ) between CONVERT(Date,'2015/2/10') and CONVERT(Date,'2015-3-10')

  3. C++之易混淆知识点五

    一.解析类继承中父类与子类之间成员的访问可见度: 外部可见度:指的是被子类继承的父类成员在子类的外部访问控制度,有protected.public.private. 内部可见度:指的是被子类继承的父类 ...

  4. canvas实现刮刮卡效果

    canvas实现刮刮卡效果 实现步骤: 设置页面背景图,即刮刮卡底部图片 绘制canvas 刮刮卡顶部图片drawImage 绑定事件 addEventListener  touchstart.tou ...

  5. (转载) Android Studio你不知道的调试技巧

    Android Studio你不知道的调试技巧 标签: android studio 2015-12-29 16:05 2514人阅读 评论(0) 收藏 举报  分类: android(74)    ...

  6. uploadifive上传文件

    uploadifive是一个款基于H5的上传文件的插件.优点是,可以在PC端,也可以在手机上进行操作.缺点是,IE9以下的兼容性不好. View: <!DOCTYPE html> < ...

  7. win7(32位)旗舰版共享HP1010打印机给WINXP专业版

    一.状况: 两台电脑,同一网段内,电脑A是WIN7系统(32位),电脑B是WINXP系统. ①电脑A(win7)已经安装完打印机驱动,能正常打印,对该打印机HP1010共享时,提示“无法保存打印机设置 ...

  8. Mysql-slowlog

    MySQL慢查询日志是MySQL提供的一种日志记录,用来记录执行时长超过指定时长的查询语句,具体指运行时间超过 long_query_time 值的 SQL 语句,则会被记录到慢查询日志中. long ...

  9. udev的规则文件

    转载于:https://linux.cn/article-9365-1.html 介绍 在 GNU/Linux 系统中,虽然设备的底层支持是在内核层面处理的,但是,它们相关的事件管理是在用户空间中通过 ...

  10. Pyhton学习——Day29

    #异常与错误# 什么是异常?# 异常就是程序运行时发生错误的信号,在程序出现错误时,则会产生异常,若没有程序处理,则会抛出异常# 导致程序在异常语句处崩溃终止# Traceback 追踪异常信号:** ...