panda_w:
     源代码发到[email protected]了!!!!!!!!!!!      快帮我看看!!!!!!!!!!!!!!!!
     

解决方案 »

  1.   

    [email protected]收到没有?收到请回答!
      

  2.   


    WaitForMultipleObjects(iThread,hThread,TRUE,INFINITE);
    第三个参数是BOOL fWaitAll=TRUE,所有线程都终止,是你希望的么?hThread[i]=CreateThread(NULL,0,PortScan,(LPVOID)&theport[i],0,&dwThreadID); 
    最后一个参数,&dwThreadID, 用于所有线程, 会不会有问题? 是否也可以用一个数组?
      

  3.   

    seedundersnow:
    WaitForMultipleObjects等所有的线程都终止是我所希望的。
    我想先在端口全部扫描完毕之后进行其他的工作。
    dwThreadID我改过为数组,结果跟目前一样。
    我甚至把hThread[i]=CreateThread(NULL,0,PortScan,(LPVOID)&theport[i],0,&dwThreadID[i]); 改成CWinThread CThread[100];
    CThread[i]=AfxBeginThread(PortScan,(LPVOID)&theport[j]);
    hThread[i]=CThread[i]->m_hThread;
    .....结果,还是程序失去响应。
      

  4.   

    如果线程函数中发生阻塞. 而你在外面一个劲的傻等. 那最后的结果就是失去响应... 
    判断是不是这种情况. 把waitformultipleobject的最后一个参数改为10000或者一个非无穷的值, 如果这时候程序不失去响应, 就证明是发生阻塞了. (应该是的, 因为没有其它的地方会发生等待或者是无限循环等). 或者把线程函数中的网络相关的语句注释掉, 不失去响应也能证明. 你的主线程不能无限的放权给子线程想什么时候结束就什么时候结束. 就等一段时间, 不行就强行关闭了它, 按端口不开放处理. 再不行就TerminateThread. 不知道这个时候的socket会如何被处理! 
      

  5.   

    如果的子线程中没有阻塞或者改为非阻塞的方式. 可以在主线程中放一个信号hEventKill来通知子线程结束. 子线程的每一个循环都用if(WaitForSingleObject(hEventKill, 0) == WAIT_TIMEOUT) break; ... 这样的语句检查一下是不是让结束了. 主线程中当开完10个子线程之后用WaitForMultipleObjects( ... all ...) 等一段时间. 之后SetEvent(hEventKill). 之后再用waitformultipleobjects等一段时间. 之后没有关闭的用closehandle关闭. 继续下全个循环...