求教高手,多线程中对话框控件的显示问题

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

11 个解决方案

#1


你的思路是正确的,子对话框由子线程单独控制管理是合理的.

现在无法自动更新显示,是不是你一开始没有加这一行:
UpdateWindow();

#2


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

#3


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

#4


引用 3 楼 sun007700 的回复:
如果你在主线程建立窗口的话,子线程更新界面是不对的,可以发消息PostMessage自定义消息给主线程,然后有主线程更新界面。

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

#5


建议还是把工作线程跟UI线程分开。

#6


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

#7


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

#8


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

没什么理由不能同时存在

#9


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

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

#10


引用 8 楼 biweilun 的回复:
没什么理由不能同时存在

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

#11


引用 9 楼 oyljerry 的回复:
UI相关的都由UI线程来操作比较好

我觉得具体问题还是得具体分析,在我的程序中,子线程去控制其窗口可以降低子线程模块的藕和性,便于这个模块的复用。

#1


你的思路是正确的,子对话框由子线程单独控制管理是合理的.

现在无法自动更新显示,是不是你一开始没有加这一行:
UpdateWindow();

#2


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

#3


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

#4


引用 3 楼 sun007700 的回复:
如果你在主线程建立窗口的话,子线程更新界面是不对的,可以发消息PostMessage自定义消息给主线程,然后有主线程更新界面。

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

#5


建议还是把工作线程跟UI线程分开。

#6


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

#7


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

#8


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

没什么理由不能同时存在

#9


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

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

#10


引用 8 楼 biweilun 的回复:
没什么理由不能同时存在

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

#11


引用 9 楼 oyljerry 的回复:
UI相关的都由UI线程来操作比较好

我觉得具体问题还是得具体分析,在我的程序中,子线程去控制其窗口可以降低子线程模块的藕和性,便于这个模块的复用。