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钟才能退出,期间没有任何的数据传输!大家有什么好的方法使这个线程正常地比较快的终止呢?
或者那个监听线程的设计不合理??大家多提提意见吧?
解决方案 »
- vc2005生成的windows服务, 是在OnStart中添加执行代码么?
- 在线程中注入dll后无法调用其回调函数的问
- 可以给我CVS版本控制方面的软件吗?
- TCHAR 数据类型 转换成 LPCSTR
- single document的exe工程,如何从自定义的类中调用CSPC1View类中的函数和变量
- *********软件设置文件的读写*****************
- 在mfc里使用全局变量?
- 怎样把一个对话框资源从一个工程导入导另一个工程??
- 如何得到网卡的MAC地址??
- ****** 讨论根据注册名,生成注册码的方法。******
- 谁能给我解释下LBP
- 关于 GetDIBits 和 GetPixel 使用
线程要等_readReport返回才能推出。
简单点就要减小这个30000ms。复杂点就要改写_readReport随时检查是否要自己退出