我在线程中recvfrom,
执行到recvfrom时就开始等待,
如果我想结束该线程除了TerminateThread(会造成资源无法释放),
还有什么其他方法吗?

解决方案 »

  1.   

    我的做法是在另一个线程中调用closesocket(s),其中s为套接字描述符,然后调用WaitForSingleObject(hThread)等待工作线程结束,hThread为工作线程的句柄。
    这种做法的原理是closesocket之后,那个执行recvfrom的工作线程则会从recvfrom得到一个错误的返回值(因为套接字被关闭),因而也从阻塞态醒过来,然后退出线程。
      

  2.   

    终止线程的三种方法作者:DEVER     分类:线程和进程 
    --------------------------------------------------------------------------------终止线程有三种方法:
    1.线程可以在自身内部调用AfxEndThread()来终止自身的运行2.可以在线程的外部调用BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode )来强行终止一个线程的运行,
    然后调用CloseHandle()函数释放线程所占用的堆栈3.第三种方法是改变全局变量,使线程的执行函数返回,则该线程终止。下面的例子来演示第三种方法
    全局变量m_end来表示是否要结束线程bool m_end = false;
    HWND hWnd;启动线程:
    CWinThread* pThread;hWnd = GetSafeHwnd();
    pThread = AfxBeginThread(ThreadProc,hWnd);
    pThread->m_bAutoDelete = false; 线程的函数
    UINT ThreadProc(LPVOID pParam);
    UINT ThreadProc(LPVOID pParam)
    {
    while(!m_end)
    {
    AfxMessageBox("test;");
    ::Sleep(2000);
    }
    return 0;
    }终止线程代码
    m_end = true;
    WaitForSingleObject(pThread->m_hThread,INFINITE);   //等待线程结束
    delete pThread;        //删除线程
      

  3.   

    若要终止线程的运行,可以使用下面的方法:
    • 线程函数返回(最好使用这种方法)。
    • 通过调用E x i t T h r e a d函数,线程将自行撤消(最好不要使用这种方法)。
    • 同一个进程或另一个进程中的线程调用Te r m i n a t e T h r e a d函数(应该避免使用这种方法)。
    • 包含线程的进程终止运行(应该避免使用这种方法)。线程函数返回
    始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是
    确保所有线程资源被正确地清除的唯一办法。
    如果线程能够返回,就可以确保下列事项的实现:
    • 在线程函数中创建的所有C + +对象均将通过它们的撤消函数正确地撤消。
    • 操作系统将正确地释放线程堆栈使用的内存。
    • 系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。
    • 系统将递减线程内核对象的使用计数。
      

  4.   

    WSAEventSelect(m_nSocket, m_hAcceptMsgEvent, FD_READ | FD_CLOSE); while (true)
    {
    if (WaitForSingleObject(m_hAcceptMsgEvent, INFINITE) == WAIT_OBJECT_0)
    {
    是否退出
    }
    int nResult = WSAEnumNetworkEvents(m_nSocket, m_hAcceptMsgEvent, &ne);
    ResetEvent(m_hAcceptMsgEvent);
    if (nResult == 0)
    {
    if (ne.lNetworkEvents & FD_READ)
    {

    nReceiveLen = recvfrom(m_nSocket, chBuffer, MAX_PACKET_SIZE, 0,
    (sockaddr*)&cliAddr, &nAddrLen);

    }
    }
    }
    if (ne.lNetworkEvents & FD_CLOSE)
    {
    退出
    }
    }
      

  5.   

    jianliang79(jianliang79) 的方法看起来应该是可行的,但总觉得有点不爽,又要创建一个线程。
    另外,free_card(痛并快乐着),closehandle()可以释放掉线程占有的资源?,毕竟那个socket没有关掉。
      

  6.   

    最好让线程自己结束,TerminateThread并不是一个好方法
    你可以使用PostThreadMessage向线程发送消息,在线程中用GetMessage来判断消息以自己结束
    如果在一个函数内部阻塞就没有什么好方法了
      

  7.   

    用WSAEventSelect(m_nSocket, m_hAcceptMsgEvent, FD_READ | FD_CLOSE);
    沒有消息的時候不調用recvfrom,這樣recvfrom就不會阻塞
      

  8.   

    我同意 qrlvls(忍者神牛) 的做法