BOOL Interface::Listen()
{
    m_bLoop = TRUE;    DWORD dwThreadID;
    m_hListenerThread = ::CreateThread(
            (LPSECURITY_ATTRIBUTES)NULL,
            0,
            (LPTHREAD_START_ROUTINE)_threadProc,
            this,
            0,
            &dwThreadID
            );
    if (m_hListenerThread == INVALID_HANDLE_VALUE) {
        m_bLoop = FALSE;
        goto _err;
    }
    return TRUE;_err:    if (m_hDevice)     {
        CloseHandle(m_hDevice);
        m_hDevice = NULL;
    }
    return FALSE;
}void Interface::Abort()
{
    m_bLoop = FALSE;
    FUNC_START_LOG("Abort");    
    if (m_hListenerThread) 
    {
        ::WaitForSingleObject(m_hListenerThread, INFINITE);
        FUNC_END_LOG("Abort");        ::CloseHandle(m_hListenerThread);
        m_hListenerThread = NULL;
    }
}DWORD WINAPI Interface::_threadProc(void *pObject)
{
    Interface *pThis = (Interface*)pObject;
    return pThis->_listenerLoop();
}DWORD Interface::_listenerLoop()
{
    BYTE report[256];
    REPORT    decrep;     FUNC_START_LOG("listenerLoop");    
    while (m_bLoop) 
    {
        DWORD dwLen = _readReport(report, sizeof(report), 30000);
        if (dwLen > 0) {
            memset(&decrep, 0, sizeof(decrep));
            if (_decodeReport(&decrep, report, dwLen)) {
                if (m_pSignPad) m_pSignPad->onReceive(&decrep);
            }
        }
    }
    FUNC_END_LOG("listenerLoop");    
    return 0;
}
_listenerLoop()函数中有个m_bLoop变量,只要这个变量为真,就一直监听,
我需要终止这个线程,在Abort中,但是m_bloop这个变量为false后,那个监听线程listenerLoop并没有立即退出,
大概需要等待20s钟才能退出,期间没有任何的数据传输!大家有什么好的方法使这个线程正常地比较快的终止呢?
或者那个监听线程的设计不合理??大家多提提意见吧?

解决方案 »

  1.   

    _readReport函数是同步还是异步的?同步的话,超时是多久?
      

  2.   

    _readReport这个是阻塞的吧?最后个参数是等待时间?
    线程要等_readReport返回才能推出。
    简单点就要减小这个30000ms。复杂点就要改写_readReport随时检查是否要自己退出
      

  3.   

    现在就是readReport等待比较耗时间,要么把它改成异步的,要么减小readReport的等待时间。
      

  4.   

    _readReport 等待时间太长了。是在不行强制关闭线程试试。TerminateThread()