设计如下:
DLL 中创建一个线程CreateThread 线程过程函数中 有一个pcap_loop(此函数会阻塞,相当于一个while循环进行处理吧)
线程处理过程中有个回调函数,我在回调里面现在没做涉及UI的操作只是单纯的存储数据。
以下是2种情况
1.创建完线程之后(直接跑起来),调用sleep,之后调试的时候在线程的过程函数里面单步会提示线程已经退出,更郁闷的是直接运行的话UI 也会直接退出。
2.创建完线程之后(直接跑起来),WaitForSingleObject(hThread, INFINITE),界面则会卡死谢谢!!

解决方案 »

  1.   

    你的WaitForSingleObject是在界面线程中调用的?
      

  2.   

    现在存在这个问题 所以回调里里面直接为空什么也没干!
    做的是抓包的小工具,考虑丢包问题,没加临界区,用异步处理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
    {
      //解包之后 调用回调函数
    }
      

  3.   

    回  VisualElevenWaitForSingleObject 是在DLL的里面创建线程之后调用的
      

  4.   

    估计是DllMain的序列化调用问题。
    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那部分有讲到这个问题。
      

  5.   


    这个是单个函数的 没在DLL_PROCESS_ATTACH 的地方写,不知道这样还会不会存在初始化问题?
    我现在改成创建的时候线程直接挂起了, 在控制台上调用这个DLL 正常,但是在MFC下面调用,整个程序马上就退出了。。这个又是怎么回事?
      

  6.   


    单个函数在什么地方调用的?如果在DllMain中调用应该还会出现序列化调用的问题。
    主线程挂起的话,应该还会出现问题。比如你调用Sleep让主线程挂起,CPU调度子线程运行,子线程退出后,但主线程还没有被唤醒,等主线程醒来的时候将永远捕捉不到子线程退出时内核状态的改变。
    至于你说的线程直接挂起,我不知道是主线程挂起还是子线程挂起。看看还有没有其他的问题吧。
      

  7.   


    DLLMAIN 中并无代码
    程序大致是这样, dll 中封装了一个类,然后由导出函数 new 一个类,之后调用这个类的创建线程函数
    我按照你之前说说的在dllmain中 加了 DiableThreadLibraryCalls,然后现在线程创建之后挂起,奇怪整个程序退出了!
      

  8.   

    还有个情况!
    创建完了之后 sleep(10000)
    线程过程函数里面,给了个死循环,程序只大概也就循环了10秒就 自己退出了!
    while(1)
    {
      pacp_loop()
    }