+ -
当前位置:首页 → 问答吧 → 删除类之前,该类的线程还没执行完而出错,要怎么解决?

删除类之前,该类的线程还没执行完而出错,要怎么解决?

时间:2011-12-06

来源:互联网

C/C++ code
/*****
* 接收的线程
*****/
UINT CSerialPort::RevThreadProc(LPVOID pParam)
{
    CSerialPort *pDlg = (CSerialPort*) pParam;
    WaitForSingleObject(Overlapped.hEvent,INFINITE);
        if (pDlg->m_hCom==INVALID_HANDLE_VALUE
            ||!pDlg->m_bRun)//在这里出错,因为CSerialPort已经被删除了
        {
            // ASSERT(0);
            return 0;
        }
}

  typedef pair<int,CSerialPort*> IntUsbcom;
  CSerialPort* m_com=new CSerialPort();
  typedef std::map<int,shared_ptr<CSerialPort>> MyMap;
  MyMap gVcom;
  gVcom.insert(IntUsbcom(1,m_com));


当删除map里的元素CSerialPort时,CSerialPort里的线程RevThreadProc还正在关闭,当判断pDlg->m_hCom就出错了,因为CSerialPort已经被删除了,程序崩溃退出.
要怎么解决?

作者: arabicsara   发布时间: 2011-12-06

你所删除的类对象在这个线程函数里面充当什么角色?

作者: pengzhixi   发布时间: 2011-12-06

等待线程关闭之后再销毁

作者: yujie_v   发布时间: 2011-12-06

引用 1 楼 pengzhixi 的回复:

你所删除的类对象在这个线程函数里面充当什么角色?
这个类对象里有五六个线程,处理了对每台终端的下载上传文件的处理,因为有几台终端,我就用了map管理;
当一台终端的USB拔掉之后,我就要删除这个map对应的值

作者: arabicsara   发布时间: 2011-12-06

先等待线程停止,再删除对象。

作者: dahuaixiaohuai   发布时间: 2011-12-06

那就等线程结束 要不然不能关闭

作者: hnuqinhuan   发布时间: 2011-12-06

waitforsingleobject

作者: yynetsdk   发布时间: 2011-12-06

让线程执行完,再去删除,或者把那个线程直接给杀掉,再删除对象

作者: ziyue007   发布时间: 2011-12-06

大家都说要等待线程先退出,那要怎么实现?我怎么知道这五六个线程全部结束了?

作者: arabicsara   发布时间: 2011-12-06

通过waitforsingleobject函数等线程句柄,或是线程退出事件。

作者: dahuaixiaohuai   发布时间: 2011-12-06

C/C++ code
UINT CSerialPort::RevThreadProc(LPVOID pParam)
{
    //CSerialPort *pDlg = (CSerialPort*) pParam;
    CSerialPort dlg = *(CSerialPort *) pParam;

    WaitForSingleObject(Overlapped.hEvent,INFINITE);
        if (pDlg->m_hCom==INVALID_HANDLE_VALUE
            ||!pDlg->m_bRun)//在这里出错,因为CSerialPort已经被删除了
        {
            // ASSERT(0);
            return 0;
        }
}

作者: joanlynnlove   发布时间: 2011-12-06

引用 10 楼 joanlynnlove 的回复:

C/C++ code
UINT CSerialPort::RevThreadProc(LPVOID pParam)
{
//CSerialPort *pDlg = (CSerialPort*) pParam;
CSerialPort dlg = *(CSerialPort *) pParam;

WaitForSingleObject(Overlapped.hEvent……
又重新声明一个CSerialPort ,这样好吗?
我CSerialPort 也有一个抽象类,virtual int ReceiveData()=0;这样就编译不过了.我试试可行性,不过效率肯定不好了

作者: arabicsara   发布时间: 2011-12-06

等待线程退出,在处理

作者: zzcmx2008   发布时间: 2011-12-06