我想在一个主线程中终止另一个正在运行线程,应该怎么解决?
在网上查了很多资料,都说的不清楚,有些说的还是错的。希望高手解答。
    我使用过GetCurrentThread()获得需要终止运行的线程的句柄,然后在主线程中使用TerminateThread()终止它,结果好像是把主线程终止了(界面没有了)。查msdn ,它说需要使用DuplicateHandle。有没有什么好的方法?还是我使用TerminateThread的方法不对?
谢谢高手指点!

解决方案 »

  1.   

    GetCurrentThread()返回的是当前线程的句柄,根本不能获得需要终止运行的线程的句柄。
      

  2.   

    你有需要终止的线程的HANDLE或id吗?如果没有,就无从变起了。使用过GetCurrentThread()获得需要终止运行的线程的句柄, 
    从字段意思理解应该知道GetCurrentThread是获取当前线程,在主线程中获取得的HANDLE是主线程的,
      

  3.   

    如果我把GetCurrentThread()放在我需要终止的线程函数中,获得的是不是需要终止的线程的句柄?
    我在几个地方都放过,但结果是一样的,主界面没有了。
      

  4.   

    而且在msdn中对GetCurrentThread()函数有这样的解释:
    The function cannot be used by one thread to create a handle that can be used by other threads to refer to the first thread. The handle is always interpreted as referring to the thread that is using it.
    意思是说,如果你在哪个线程中使用它,它就会被解释成哪个线程的句柄。那么是不是说,如果我在主线程中使用在需要终止的线程中获得的句柄,它就会被自动解释成主线程的句柄???
        但是,网上又有人说可以在一个线程中使用GetCurrentThread,然后在另一个线程中使用TerminateThread()终止它?  到底对还是错?问题应该怎么解决?
      

  5.   

    to DentistryDoctor(不在无聊中无奈,就在沉默中变态):
         我在创建线程的时候使用的是AfxBeginThread,返回的是CWinThread *m_pThread.没有HANDLE或id,如果使用GetCurrentThread()不行的话,我应该怎么获得?
        谢谢!
      

  6.   

    CWinThread::m_hThread 线程HANDLE
    CWinThread::m_nThreadID 线程ID
      

  7.   

    但是,网上又有人说可以在一个线程中使用GetCurrentThread,然后在另一个线程中使用TerminateThread()终止它?  到底对还是错?问题应该怎么解决?他是说把GetCurrentThread得到的值扔到另一个线程中,然后在另一个线程中使用这个值并配合TerminateThread()终止它
      

  8.   

    终止线程的问题我已经解决了。
    要用TerminateThread(),必须有线程句柄,我已经获得了CWinThread *m_pThread,通过m_pThread->m_hThread可以很容易获得句柄。
    但是现在的问题是:
       我终止了正在运行的那个线程后,再一次想开启那个线程(仍然调用AfxBeginThread),却无法启动那个线程?我应该怎么办?
       请高手指点!
      

  9.   

    GetCurrentThread 返回的是一个伪句柄,不能在另外一个线程中使用这个句柄可以使用 GetCurrentThreadId 加 OpenThread 试试
      

  10.   

    尽量不要使用 TerminateThread 来终止线程,它会导致C++析构函数来不及执行,资源来不及释放
      

  11.   

    用一个变量来标识,让那个线程自己退出。
    然后你Sleep一下,如果那个线程还不退出,再使用TerminateThread()。
    另外,不能用GetCurrentThread(),要用GetCurrentThreadId。
      

  12.   

    问题已经解决。
    我用了CEvent和WaitSingleObject,可以很好的让线程自然结束。
    谢谢大家!
      

  13.   

    提供一个简单的做法,在你想结束的线程中调用GetCurrentThread(),并把这个值保存到你的主线程的某个变量中,然后在你的主线程中调用TerminateThread()去结束。