很简单,像WaitForSingleObject这种函数都会占用进程的
绝大部分CPU,使得你的工作线程阻塞,而无法退出,而你的主线程
又一直等待最后造成死锁。
而GetExitCodeThread的循环调用也是CPU密集型处理,跟上面原理一样。
最后一种方法则是通过循环消息调用的方式,在消息队列处理时中间存在着很多
IDLE时间,供工作线程继续工作,所以能成功,实际上你把上述代码放在定时器
中,也能成功。
解决方法是将工作线程的优先级设定为跟主线程一样高(缺省是要低),这样既便
主线程阻塞,工作线程也能获得CPU时间。

解决方案 »

  1.   

    这是我从MSDN里面找到的一段话:
    Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.
    我在这里尝试翻译一下:
    关闭一个线程的句柄并不是结束了那个相关的线程。若要清除一个线程对象,你必需先结束了这个线程,然后关闭所有与那个线程相关联的句柄(一个线程可以有多个句柄与之相关联)。
    也就是说,要想切底从系统里移走一个线程对象,必需符合以下两个条件:
    1。结束了那个线程,这里的结束指的是TERMINATE(可能译作中止会好一点)。
    2。所有与那个线程相关的句柄都为NULL。
    好了,言归正传,在你的例1与例2中,你只是CLOSE了线程的一个HANDLE,并没有TERMINATE它,所以会造成你所说的“死锁”了。请访问我的主页:
    http://cloudshadow.go.163.com
    是一个介绍VC编程的主页,欢迎大家留言板留言,我会在那回等侍大家光临!
      

  2.   

    这是我从MSDN里面找到的一段话:
    Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.
    我在这里尝试翻译一下:
    关闭一个线程的句柄并不是结束了那个相关的线程。若要清除一个线程对象,你必需先结束了这个线程,然后关闭所有与那个线程相关联的句柄(一个线程可以有多个句柄与之相关联)。
    也就是说,要想切底从系统里移走一个线程对象,必需符合以下两个条件:
    1。结束了那个线程,这里的结束指的是TERMINATE(可能译作中止会好一点)。
    2。所有与那个线程相关的句柄都为NULL。
    好了,言归正传,在你的例1与例2中,你只是CLOSE了线程的一个HANDLE,并没有TERMINATE它,所以会造成你所说的“死锁”了。请访问我的主页:
    http://cloudshadow.go.163.com
    是一个介绍VC编程的主页,欢迎大家留言板留言,我会在那回等侍大家光临!
      

  3.   

    在VC里直接调用ExitProcess();当其结束时仍可能保留在内存中,这时就要关闭所有句柄,可以用GetExitCodeProcess取得退出码
      

  4.   

    也可以用TerminateProcess强迫进程结束