设计如下:
DLL 中创建一个线程CreateThread 线程过程函数中 有一个pcap_loop(此函数会阻塞,相当于一个while循环进行处理吧)
线程处理过程中有个回调函数,我在回调里面现在没做涉及UI的操作只是单纯的存储数据。
以下是2种情况
1.创建完线程之后(直接跑起来),调用sleep,之后调试的时候在线程的过程函数里面单步会提示线程已经退出,更郁闷的是直接运行的话UI 也会直接退出。
2.创建完线程之后(直接跑起来),WaitForSingleObject(hThread, INFINITE),界面则会卡死谢谢!!
DLL 中创建一个线程CreateThread 线程过程函数中 有一个pcap_loop(此函数会阻塞,相当于一个while循环进行处理吧)
线程处理过程中有个回调函数,我在回调里面现在没做涉及UI的操作只是单纯的存储数据。
以下是2种情况
1.创建完线程之后(直接跑起来),调用sleep,之后调试的时候在线程的过程函数里面单步会提示线程已经退出,更郁闷的是直接运行的话UI 也会直接退出。
2.创建完线程之后(直接跑起来),WaitForSingleObject(hThread, INFINITE),界面则会卡死谢谢!!
做的是抓包的小工具,考虑丢包问题,没加临界区,用异步处理m_hTrd = CreateThread(NULL, 0, SnifferThread, &m_Dev, 0 , 0);
if (!m_hTrd) return false;
m_bTrdConti = true;
//Sleep(1000);//(1)这样线程会马上退出
WaitForSingleObject(m_hTrd, -1); 界面卡死DWORD WINAPI SnifferThread(LPVOID lpParameter)
{
char errbuf[PCAP_ERRBUF_SIZE] = {0};
stDevs *pDev = (PDevs)lpParameter;
//打开设备
pcap_open(pDev->pDstDev->name,65536, 0 ,1000,NULL,errbuf))
//释放设备列表
pcap_freealldevs(pDev->pAlldevs); //开始捕捉;
pcap_loop(pDev->pAdhandle, 0, CSniff::packet_handler, pDev->pClass);
return 1;
}CSniff::packet_handler
{
//解包之后 调用回调函数
}
m_hTrd = CreateThread(NULL, 0, SnifferThread, &m_Dev, 0 , 0);
if (!m_hTrd) return false;
m_bTrdConti = true;
//Sleep(1000);//(1)这样线程会马上退出
WaitForSingleObject(m_hTrd, -1); 界面卡死这段代码是在DllMain的 DLL_PROCESS_ATTACH 写的吧,主线程在创建子线程之后,系统必须用DLL_THREAD_ATTACH来再次调用DllMain。但是由于这时主线程还未完成对DllMain的处理,因此子线程此时会被挂起。主线程等待子线程结束才能完成DllMain的处理,而子线程又必须等到主线程完成对DllMain的处理后才能调用DllMain。典型的死锁情况发生了。可以试试在DllMain中调用DiableThreadLibraryCalls,以阻止系统向DllMain发送DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知。这样子线程可能就不会调用DllMain。不过这样可能还有问题。最好不要在DllMain里WaitForSinleObject。《windows核心编程》dll那部分有讲到这个问题。
这个是单个函数的 没在DLL_PROCESS_ATTACH 的地方写,不知道这样还会不会存在初始化问题?
我现在改成创建的时候线程直接挂起了, 在控制台上调用这个DLL 正常,但是在MFC下面调用,整个程序马上就退出了。。这个又是怎么回事?
单个函数在什么地方调用的?如果在DllMain中调用应该还会出现序列化调用的问题。
主线程挂起的话,应该还会出现问题。比如你调用Sleep让主线程挂起,CPU调度子线程运行,子线程退出后,但主线程还没有被唤醒,等主线程醒来的时候将永远捕捉不到子线程退出时内核状态的改变。
至于你说的线程直接挂起,我不知道是主线程挂起还是子线程挂起。看看还有没有其他的问题吧。
DLLMAIN 中并无代码
程序大致是这样, dll 中封装了一个类,然后由导出函数 new 一个类,之后调用这个类的创建线程函数
我按照你之前说说的在dllmain中 加了 DiableThreadLibraryCalls,然后现在线程创建之后挂起,奇怪整个程序退出了!
创建完了之后 sleep(10000)
线程过程函数里面,给了个死循环,程序只大概也就循环了10秒就 自己退出了!
while(1)
{
pacp_loop()
}