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随时检查是否要自己退出
线程要等_readReport返回才能推出。
简单点就要减小这个30000ms。复杂点就要改写_readReport随时检查是否要自己退出
#3
现在就是readReport等待比较耗时间,要么把它改成异步的,要么减小readReport的等待时间。
#4
同步,异步
学习
学习
#5
_readReport 等待时间太长了。
是在不行强制关闭线程试试。
TerminateThread()
是在不行强制关闭线程试试。
TerminateThread()
#1
_readReport函数是同步还是异步的?同步的话,超时是多久?
#2
_readReport这个是阻塞的吧?最后个参数是等待时间?
线程要等_readReport返回才能推出。
简单点就要减小这个30000ms。复杂点就要改写_readReport随时检查是否要自己退出
线程要等_readReport返回才能推出。
简单点就要减小这个30000ms。复杂点就要改写_readReport随时检查是否要自己退出
#3
现在就是readReport等待比较耗时间,要么把它改成异步的,要么减小readReport的等待时间。
#4
同步,异步
学习
学习
#5
_readReport 等待时间太长了。
是在不行强制关闭线程试试。
TerminateThread()
是在不行强制关闭线程试试。
TerminateThread()