怎么正确结束监听线程?

时间:2021-08-01 01:19:03



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钟才能退出,期间没有任何的数据传输!

大家有什么好的方法使这个线程正常地比较快的终止呢?
或者那个监听线程的设计不合理??

大家多提提意见吧?

5 个解决方案

#1


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

#2


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

#3


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

#4


同步,异步

学习

#5


_readReport 等待时间太长了。

是在不行强制关闭线程试试。

TerminateThread()

#1


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

#2


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

#3


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

#4


同步,异步

学习

#5


_readReport 等待时间太长了。

是在不行强制关闭线程试试。

TerminateThread()