zoukankan      html  css  js  c++  java
  • C++线程安全退出

    HANDLE m_EvtThreadExit[MaxVisionNum];   //定义
    
    方法一
    
    for(int i=0;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 1;
    }
    
    
    
    方法二
    
    for (int i=0;i<MaxVisionNum;i++)
    {
    threadParma[i].pThis = this;
    threadParma[i].visionIndex = i;
    CWinThread *pthread = AfxBeginThread( VisionThread, &(threadParma[i]), THREAD_PRIORITY_NORMAL, 0, 
    CREATE_SUSPENDED );
     pthread->m_bAutoDelete = false;             ////关闭句柄自动删除
     m_EvtThreadExit[i] = pthread->m_hThread;        //关联CWinThread句柄
    pthread->ResumeThread();
    
    }
    
    
    
    方法三
    
    for (int i=0;i<MaxVisionNum;i++)
    {
    threadParma[i].pThis = this;
    threadParma[i].visionIndex = i;
    m_EvtThreadExit[i] = CreateThread(NULL,0,ThreadProc,&(threadParma[i]),0,NULL);   //关联句柄
    }
    
    DWORD WINAPI ThreadProc(LPVOID lpParam) 
    { 
    TThreadParam * pParam = (TThreadParam *)lpParam;
    CMilTestDlg * pDlg = (CMilTestDlg *)(pParam->pThis);
    int visionIndex = pParam->visionIndex;
    pDlg->VisionProcess(visionIndex);
    return 1;
    }
    
    
    
    
    
    /*****************************通用 **************************************/
    //判断退出,
    
    void CMilTestDlg::DoEvents()
    {
    MSG msg;
    while (::PeekMessage(&msg,NULL,0,0,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,1); if(ret == WAIT_OBJECT_0) { break; } } TRACE("cost (ms): %d ",GetTickCount() - t); }
  • 相关阅读:
    一张图理解prototype、proto和constructor的三角关系
    深入理解javascript对象系列第三篇——神秘的属性描述符
    深入理解javascript对象系列第二篇——属性操作
    深入理解javascript对象系列第一篇——初识对象
    javascript类型系统——Math对象
    Django的第一个页面
    关于原型链
    js中的继承问题
    面向对象关于函数以及this的问题
    关于bind、call以及apply
  • 原文地址:https://www.cnblogs.com/profession/p/7443502.html
Copyright © 2011-2022 走看看