解决方案 »

  1.   

    我觉得这个应该程序的 BUG,不应该这么解决。
    应该修改在程序关闭的时候,就是关闭了。
      

  2.   


    我手上有个别人写的DLL 和我的功能一样 他的就可以关闭进程 但是 我套用他的相关语句 结果还是不行 不知道怎么回事
      

  3.   

    这个会不会是MFC程序的问题,如果不加载com组件会不会正常退出呢。
      

  4.   

    实在不行这个dll什么都不做看还会不,如果不会就逐渐添加。感觉像是退出时阻塞在哪里了
      

  5.   


    关闭MFC的对话框 但是ABC.exe这个进程还是存在 就会导致之前用的那个串口一直被占用 要是再次打开ABC 就无法执行功能了 除非先在任务管理器手动结束进程 然后再打开ABC 就可以了 
    你的MFC关闭是不是先释放窗体再去断开串口的?可能是关串口的时候一直卡在那里了或者是关串口时有等待操作没返回,所以导致窗体没了任务管理器中有没有结束的进程,而结束进程后串口又可以用了的问题。
      

  6.   


    关闭MFC的对话框 但是ABC.exe这个进程还是存在 就会导致之前用的那个串口一直被占用 要是再次打开ABC 就无法执行功能了 除非先在任务管理器手动结束进程 然后再打开ABC 就可以了 
    你的MFC关闭是不是先释放窗体再去断开串口的?可能是关串口的时候一直卡在那里了或者是关串口时有等待操作没返回,所以导致窗体没了任务管理器中有没有结束的进程,而结束进程后串口又可以用了的问题。
    我的串口操作相关函数用的是封装好的SerialPort 类  刚才下载源代码看了下 他里面的结束函数是
    BOOL CSerialPort::StopMonitoring()
    {
    SuspendThread(m_Threadhandle);
    return TRUE;
    }这个SuspendThread貌似是挂起线程吧?是不是不能挂起 要用杀死线程的语句才可以? 那杀死线程用什么语句呢
      

  7.   


    我的串口操作相关函数用的是封装好的SerialPort 类  刚才下载源代码看了下 他里面的结束函数是
    BOOL CSerialPort::StopMonitoring()
    {
    SuspendThread(m_Threadhandle);
    return TRUE;
    }这个SuspendThread貌似是挂起线程吧?是不是不能挂起 要用杀死线程的语句才可以? 那杀死线程用什么语句呢
      

  8.   

    SuspendThread是挂起线程,这个API使用起来有一定危险性。如果要退出了当然是要把线程结束,结束线程最标准的做法就是让线程函数return。
    我经常的做法就是通过修改标志位或者事件通知来让线程循环退出,线程函数自动return,为了确保线程结束,会waitforsingleobject这个线程句柄,一般等个几秒,如果还没等到就只好暴力退出了TerminageThread
      

  9.   


    谢谢啊 那这个TerminageThread的用法是什么呢 我上面是SuspendThread(m_Threadhandle); 那现在就是
    TerminageThread(m_Threadhandle,0);就行了么 另外我刚才编译的时候提示TerminageThread未定义 这个函数的头文件是什么呢?
      

  10.   

    不能这样,
    看看你有没有执行 CSerialPort 那个类的析构函数。这个很重要的。
    在那个析构函数里面,肯定会激发一个事件。然后等待线程关闭。
    而这个线程将会被 串口线程检测到,当检测到这个事件的时候,这个线程就自动退出了。
    永远不要尝试强制结束一个线程。还有,这个有 StartMonining 的 CSerialPort 有 BUG 的。但是如果你不尝试多次创建和销毁就不影响程序的。
      

  11.   

    BOOL WINAPI TerminateThread(
      __inout  HANDLE hThread,
      __in     DWORD dwExitCode
    );
      

  12.   


    你指的构析函数是哪个呢。。我用的时候就是
    m_t.InitPort();
    m_t.StartMonitoring();
    m_t.WriteToPort(p);
    结束就是
    m_t.StopMonitoring(); 就用了这4个函数
    其中这个就是StartMonitoring的代码 您说的BUG是指什么呢?
    BOOL  CSerialPort::StartMonitoring()
    {
    if (!(m_Thread = AfxBeginThread(CommThread, this)))
    return FALSE; m_Threadhandle = (HANDLE)_beginthreadex( NULL, 0, CSerialPort::CommThread, this, CREATE_SUSPENDED, (UINT*)&m_uThreadId );
    if(!m_Threadhandle)
    return FALSE; ResumeThread(m_Threadhandle); return TRUE;
    }
      

  13.   

    你说的是这个函数么
    CSerialPort::~CSerialPort()
    {
    do
    {
    SetEvent(m_hShutdownEvent);
    } while (m_bThreadAlive); //TRACE("Thread ended\n");
    // WriteTrace(_T("Thread ended"));
    delete [] m_szWriteBuffer; memset(m_Recv,0,1024);
    m_Reclen=0;
    }  代码里面有这个函数 但是我不知道这是干什么用的 就没管
      

  14.   

    //TRACE("Thread ended\n");
    看看这个注释掉的 TRACE,就知道了。
    当打印这个 TRACE 的时候,就是告诉你,那个线程已经结束了。// 所以如果你的 CSerialPort 是 new 出来的,就要 delete .
    // 如果是其他类的程序,就要保证这个类被析构。但是我好奇怪哦,你的程序里面不是创建了两个Thrad 吗?
    还有一个在哪里结束的??
      

  15.   

    这个问题很明显是你MFC程序或Com DLL中有线程没有结束导致的。进程中如果有线程没有被结束掉,那么进程是不会退出的。我感觉最有可能的是你com dll中处理串口的地方的线程,接收串口数据接口是阻碍的,所以一般都会用一个线程来处理,估计就是这个线程没结束。
    这是一个程序的缺陷,最好不要用强制的办法结束进程。