建立了一个对话框程序,在对话框上的一个子窗口位置,建立了一个子对话框,这个子对话框是在新线程中建立,新线程有自定义的消息循环和消息处理函数,子对话框建立正常,问题是子对话框中的控件没法自动更新显示,只有线程中更新了的控件才能看见。请问应该如何处理?
试过把窗口建立放入主线程中,由主线程来处理消息函数,这时子对话框控件显示正常,不过当子线程去更新界面时会有死锁的情况发生,而且似乎子对话框主要由子线程控制更合理些。

解决方案 »

  1.   

    你的思路是正确的,子对话框由子线程单独控制管理是合理的.现在无法自动更新显示,是不是你一开始没有加这一行:
    UpdateWindow();
      

  2.   

    多谢楼上。
    我在消息循环函数里加上UpdateWindow()后显示正常了。加到这里正确吗?效率有没影响?
      

  3.   

    "试过把窗口建立放入主线程中,由主线程来处理消息函数,这时子对话框控件显示正常,不过当子线程去更新界面时会有死锁的情况发生,而且似乎子对话框主要由子线程控制更合理些。"
    如果你在主线程建立窗口的话,子线程更新界面是不对的,可以发消息PostMessage自定义消息给主线程,然后有主线程更新界面。
      

  4.   

    这样应该没问题,不过我还是想完全由子线来控制窗口。现在是在主对话框的OnPaint()中调用子窗口的UpdateWindow();显示没问题,但是在消息循环函数中,MsgWaitForMultipleObjects()函数的调用中,必须把
    等待时间设为0,否则就示控件无法更新显示的现象出现。但这样的话CPU占用率太高,求教解决方案。
      

  5.   

    问题是工作线程要操作子窗口的dc,也就是说工作线程应该和子窗口的显示内容同步,如果用PostMessage()的话,
    显然同步是一个问题。
      

  6.   

    终于发现出问题的原因,还是窗口风格设置的问题。我建立的子对话框,窗口风格是动态设置的,开始时是WS_Popup,设置父窗口后,去掉了WS_Popup改成了WS_CLIPCHILDREN,这个风格显示有问题。最后直接加上WS_CHILD风格后,显示一切正常。很奇怪,WS_CHILD居然能和WS_Popup同时存在,去掉WS_Popup还要出错。
      

  7.   

    要检查你的对话框属性是否正确...
    UI相关的都由UI线程来操作比较好
      

  8.   

    呵呵,原来一直以为popup、overlapped、child三种属性是相互冲突,只能选择一种。