这要怎么判断?
这个类对象里有五六个线程,处理了对每台终端的下载上传文件的处理,因为有几台终端,我就用了map管理;
当一台终端的USB拔掉之后,我就要删除这个map对应的值

解决方案 »

  1.   

    你是判断usb模拟的串口吗?
    设置串口的状态,串口会马上结束等待,从而可以达到快速退出线程的目的。
      

  2.   

    用线程句柄waitformultipleobjects       
      

  3.   

    SetCommMask( g____hComm, EV_RXCHAR | EV_TXEMPTY );串口线程里面的ReadFile函数立即返回,如果线程里再加一些判断,那么就可以快速退出线程了。比如外面
    exitflag = TRUE;
    SetCommMask( g____hComm, EV_RXCHAR | EV_TXEMPTY );线程里面
    if( ReadFile( ... ... ) )
    {
    }
    if( exitflag )
    {
           return 1;
    }
      

  4.   

    CSerialPort::~CSerialPort()
    {
    if (ptRevThreadProc)
    {
    WaitForSingleObject(ptRevThreadProc->m_hThread,INFINITE);//偶尔会在这里出错
    }
        DeleteCriticalSection(&m_bRevCS);
    }现在增加了在删除类之前等待线程退出,偶尔还是会出错,在WaitForSingleObject,不知道为什么这个类已经被删除了
    我把智能指针去掉,自己在erase的时候delete,还是会出错
    求解决方法:要在哪里等待线程退出?我写在类的析构函数里不行吗?
      

  5.   

    我是设置成EV_RXCHAR,有影响吗?我就是在快速退出线程前,在线程里判断的时候出错了(因为类被删除了)
      

  6.   

    我觉得你没把问题描述清楚,你想问的东西貌似跟串口啥的没关系,应该是你的控制逻辑上面有问题。按我的理解,你现在好像是n个对象,由n个不同的线程操作。现在是退出的时候,可能你把还在用的对象删除了,所以出错。
    应该是你的对象维护逻辑上面有些问题。假如port需要被2个以上的线程同时关注,那么你在任何一个线程里面删除他都会有问题。唯一的解决办法是用引用计数来自删除。
    类似这样port{
    long nRef;
    port(){nRef=0;}
    void addRef(){interlockedincrcement(&nRef);
    long release(){
    if(interlockeddecricement(&nRef)==0)
    {
        delete this;
        return 0;
    }
    return nRef;
    }
    }port对象自己维护删除自己的时机。然后需要用到她的线程addRef,不用时release掉。这样主线程只需等待所有工作线程结束,就可以安全的关闭掉port(release()掉)