CWinThread* m_Walk=NULL;
if (!m_Walk)
{
m_Walk=AfxBeginThread(m_Manipulator->ThreadWalk,(LPVOID)m_Manipulator);
m_Walk->m_bAutoDelete = FALSE;
m_Walk->ResumeThread();
}请问如何终止这样的线程?请给出代码!

解决方案 »

  1.   

    就在CSDN里面搜一下,一大堆解决办法
      

  2.   

    TerminateThread(m_Walk,0);
    CloseHandle(m_Walk);
    m_Walk=NULL;
      

  3.   

    TerminateThread(m_Walk,0); 中的第二个参数0是什么意思啊?
      

  4.   

    问msdn吧,呵呵ParametershThread    A handle to the thread to be terminated.    The handle must have the THREAD_TERMINATE access right. For more information, see Thread Security and Access Rights.
    dwExitCode    The exit code for the thread. Use the GetExitCodeThread function to retrieve a thread's exit value.
      

  5.   

    TerminateThread()这个方法不是很好!
    还有别的方法吗?
      

  6.   

    不知道你是想让线程自己结束还是手动去结束线程。如果是后者,就TerminateThread(),如果是前者在线程里return不就OK了
      

  7.   

    手动!但是TerminateThread()不是很安全!
      

  8.   

    大致流程:
    SuspendThread(handle);
    GetThreadContext(handle, &context);
    context->Esp -= 4;   // 调整堆栈,模拟压入一个参数
    context->Eip = ExitThread; // 下一条指令指向ExitThread
    SetThreadContext(handle, context); 
    ResumeThread(handle); // thread 会自己执行ExitThread(...)
      

  9.   

    大致流程:
    SuspendThread(handle);
    GetThreadContext(handle, &context);
    context->Esp -= 4;   // 调整堆栈,模拟压入一个参数
    context->Eip = ExitThread; // 下一条指令指向ExitThread
    SetThreadContext(handle, context); 
    ResumeThread(handle); // thread 会自己执行ExitThread(...)
      

  10.   

    大致流程如下: (缺点,线程的退出码是个随机数)
    1. SuspendThread(handle);
    2. GetThreadContext(handle, &context);
    3. context.Esp -= 4;  // 模拟一个参数压栈
    4. context.Eip = ExitThread;
    5. SetThreadContext(handle, &context);
    6. ResumeThread(handle);  // thread会自动执行ExitThread(...)
      

  11.   

    大致流程如下: (缺点,线程的退出码是个随机数)
    1. SuspendThread(handle);
    2. GetThreadContext(handle, &context);
    3. context.Esp -= 4;  // 模拟一个参数压栈
    4. context.Eip = ExitThread;
    5. SetThreadContext(handle, &context);
    6. ResumeThread(handle);  // thread会自动执行ExitThread(...)
      

  12.   

    毫无疑问, 会. 因为没有执行线程体中释放资源的代码. 其实如果线程自己正常退出时不释放它分配的资源时也一样会造成内存泄漏. 如果你能够反向线程体代码的话可以通过上述方法指定context.Eip让线程自己跳转到它的结束代码部分.上述方法常用于结束其他进程的, 不过它不是用ExitThread而是ExitProcess并且设置了退出码而已. 可以保证被结束进程可以正确释放所有资源.
      

  13.   

    但是这么做还是并没有真正的结束一个线程的执行,以下给出我的解决方案
    DWORD Jade_ThreadByEvent::Kill()
    {
    DWORD dwKill = 0,dwExitTime = 200;
    if(m_hThread != NULL)
    {
    //检查线程状态
    if(JADE_SUCCEEDED(CheckState(TLS_STOP)))
    {
    Restart();
    }
    SetEvent(m_hEvent[0]);
    dwKill = WaitForSingleObject(m_hWaitEvent[1],INFINITE);
    do
    {
    if(!GetExitCodeThread(m_hThread,&dwKill)||dwExitTime==1000)
    {
    Abend(); //异常非法结束
    return GetLastError();
    }
    Sleep(dwExitTime);
    dwExitTime++;
    }while(dwKill != m_dwReturn);
    CloseHandle(m_hThread);
    m_hThread = NULL;
    return JADE_OK;
    }
    return JADE_THREAD_KILLED;
    }
      

  14.   

    if(m_hThread!=NULL)
    {
        m_bContinue=FALSE;// 跳出Thread线程的循环
        DWORD exitcode;
        if(GetExitCodeThread(m_hThread,&exitcode))
        {
           if(exitcode==STILL_ACTIVE)
           {
              m_bContinue=FALSE; // 跳出Thread线程的循环
            }
        }    CloseHandle(m_hThread);
        m_hThread=NULL;
    }这个方法能安全退出线程比TerminateThread()要好,防止了无法终止线程的异常情况。