试过把窗口建立放入主线程中,由主线程来处理消息函数,这时子对话框控件显示正常,不过当子线程去更新界面时会有死锁的情况发生,而且似乎子对话框主要由子线程控制更合理些。
11 个解决方案
#1
你的思路是正确的,子对话框由子线程单独控制管理是合理的.
现在无法自动更新显示,是不是你一开始没有加这一行:
UpdateWindow();
现在无法自动更新显示,是不是你一开始没有加这一行:
UpdateWindow();
#2
多谢楼上。
我在消息循环函数里加上UpdateWindow()后显示正常了。加到这里正确吗?效率有没影响?
我在消息循环函数里加上UpdateWindow()后显示正常了。加到这里正确吗?效率有没影响?
#3
"试过把窗口建立放入主线程中,由主线程来处理消息函数,这时子对话框控件显示正常,不过当子线程去更新界面时会有死锁的情况发生,而且似乎子对话框主要由子线程控制更合理些。"
如果你在主线程建立窗口的话,子线程更新界面是不对的,可以发消息PostMessage自定义消息给主线程,然后有主线程更新界面。
如果你在主线程建立窗口的话,子线程更新界面是不对的,可以发消息PostMessage自定义消息给主线程,然后有主线程更新界面。
#4
这样应该没问题,不过我还是想完全由子线来控制窗口。现在是在主对话框的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
没什么理由不能同时存在
#9
要检查你的对话框属性是否正确...
UI相关的都由UI线程来操作比较好
#10
呵呵,原来一直以为popup、overlapped、child三种属性是相互冲突,只能选择一种。
#11
我觉得具体问题还是得具体分析,在我的程序中,子线程去控制其窗口可以降低子线程模块的藕和性,便于这个模块的复用。
#1
你的思路是正确的,子对话框由子线程单独控制管理是合理的.
现在无法自动更新显示,是不是你一开始没有加这一行:
UpdateWindow();
现在无法自动更新显示,是不是你一开始没有加这一行:
UpdateWindow();
#2
多谢楼上。
我在消息循环函数里加上UpdateWindow()后显示正常了。加到这里正确吗?效率有没影响?
我在消息循环函数里加上UpdateWindow()后显示正常了。加到这里正确吗?效率有没影响?
#3
"试过把窗口建立放入主线程中,由主线程来处理消息函数,这时子对话框控件显示正常,不过当子线程去更新界面时会有死锁的情况发生,而且似乎子对话框主要由子线程控制更合理些。"
如果你在主线程建立窗口的话,子线程更新界面是不对的,可以发消息PostMessage自定义消息给主线程,然后有主线程更新界面。
如果你在主线程建立窗口的话,子线程更新界面是不对的,可以发消息PostMessage自定义消息给主线程,然后有主线程更新界面。
#4
这样应该没问题,不过我还是想完全由子线来控制窗口。现在是在主对话框的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
没什么理由不能同时存在
#9
要检查你的对话框属性是否正确...
UI相关的都由UI线程来操作比较好
#10
呵呵,原来一直以为popup、overlapped、child三种属性是相互冲突,只能选择一种。
#11
我觉得具体问题还是得具体分析,在我的程序中,子线程去控制其窗口可以降低子线程模块的藕和性,便于这个模块的复用。