程序中main thread是MFC的主界面thread,开始先启动一个处理数据的子thread,处理完毕子thread自动销毁。可是在子thread的处理过程中,用户如果操作界面,会激发main thread的某个消息函数,在函数中必须对数据进行重新更新。因此main thread需要等待子thread终结。可是当在消息处理函数中等待子线程的时候,main thread居然会死掉!!   不知道为什么,目前根据现象是因为CPU被切换到主线程后,无法再回到子thread中去,因此造成了死锁!!可是为什么会这样呢?主线程优先级比子线程高的原因么???

解决方案 »

  1.   

    是其它问题吧,WaitForSingleObject不占用CPU时间的,有用户界面的线程等待其它信号很恶心的,可以自己重开个窗口写上数据正在处理啊之类的来消磨一下时间可能用户的感觉更好,呵呵
      

  2.   

    GUI线程中用Wait....,容易造成界面假死
      

  3.   

    TO oyljerry:
       假死的原因能否解释一下呢?
      

  4.   

    主线程等待子线程的时候,如果子线程SendMessage到主线程,那么程序会死锁。
      

  5.   

    楼上用PostMessage不就好了吗?
    界面假死是因为界面线程被阻塞无法在处理消息(重画,响应按键等)
      

  6.   

    WaitForSingle函数是等待某一核心对象释放,在没有被释放之前,处理不会继续。所以,你等待子线程结束,如果子线程仍在运行,则主线程不会处理任何重绘消息,造成界面的假死状态,如果子线程结束,主线程恢复处理,则恢复正常。建议使用其他方法进行同步,例如子线程锁死一个数据区域,处理完毕之后通知主线程,可以更新显示。
      

  7.   

    TO  楼上各位问题在于造成界面假死后,确实应该如上所书, 子线程结束,主线程恢复处理,则恢复正常。但是如果是在主线程的MFC消息处理函数中wait,那么发现系统居然很久也不会切换到子线程,子线程也就没有机会结束。
    于是整体就会假死。关于这点,不知道大家还有什么高见没有?? 多谢先
      

  8.   

    主函数中WaitForSingleObject(hThread, timeout) ;timeout可以设置成一个比较大的时间如果超时则结束子线程,这样做可以防止界面假死,但是强制结束子线程的方法还是不太好。可以在在子线程主循环和关键循环中加入一个对线程是否需要结束的变量bTreadRun判断,主函数需要结束子线程时候先设置bTreadRun=false,再wait,这样子线程可以安全退出,是比较好的方法至于处理wait,应该不会影响子线程的运行的。
      

  9.   

    当然会死在那里啦。
    因为main thread还要负责当前窗口的消息loop,如果被你恶意停在那里,就不能完成重绘,等多个消息的处理你只要在一个辅助线程里做这样伤心病狂的事. :)
      

  10.   

    在子线程中wait,可以设置超时,这样超时后,就会执行后面的了
    或在线程中Sleep让出一下CPU,这样主线程就可以得到执行的机会
      

  11.   

    waitforsingleobject会使GUI线程挂起不能处理消息导致GUI界面死掉
      

  12.   

    各位,最后想了这样一种做法,好像效果还不错!目前还没有发现问题。
    main thread:每当某消息函数会激发child thread的时候,用一个变量作为缓冲,存储child 需要处理的数据区的指针。如果消息函数非常快的被重复激发,比如重复按key,如果这时child thread正在运行中,则设置另外的变量通知childthread 终止当前的处理,缓冲区只存储最新的数据存储的pointer。也就是最后一个pointer,并对pointer的访问通过临界区来控制。child thread:平时使用pointer来使用数据区的数据完成界面上某个控件的描绘工作,正常的画完的话就死掉。如果main thread还在不停的更新数据区的指针,并且收到了被打断的通知,那就先删掉所有旧的画好的东西,使用新的数据重新画。