» 您尚未登录:请 登录 | 注册 | 标签 | 帮助 | 小黑屋 |


发新话题
打印

[其他] TG的程序员进。。。问一个有关UI多线程获取对话框指针的问题。。。。

你的设计思路不对,应该B获得A告诉它的A上的变量,甚至更好一点是应该数据和视图分离。

方案一:A告知B,B使用:
-B窗口为平台窗口类的派生类ClassWndB,构造函数接受一个参数,用来初始化ClassWndB的成员变量mValueX.
在该类的其他方法中完成对mValueX的使用,和窗口内控件的布局,最后调用继承的平台窗口类显示的方法显示B窗口本体。
-在A窗口对应的类实现中的按钮事件方法中,以A窗口的变量x值去构造ClassWndB的一个实例。
-完毕

方案二:数据与视图分离
另外建一个数据管理类DataMgr,存放变量X,同时含有对变量X存取的成员方法。
在A窗口类中的对应事件(比如控件值变化事件)中调用DataMgr类中写入变量X的成员方法。
在B窗口类中的对应事件(比如B窗口的onCreate)中调用DataMgr类中读取变量的成员方法。
A窗口类实例和B窗口类实例的初始化时由初始化方赋予DataMgr的同一个实例。
完毕。
备注:如果存在多线程访问存取,记得加锁,但是我觉得你的用例里说是UI多线程,但似乎不存在多线程同时访问存取的问题。


本帖最近评分记录
  • shixn 激骚 +6 感谢分享 2013-7-1 01:25

TOP

引用:
原帖由 shixn 于 2013-6-30 00:54 发表

这个思路我也想过,所以就产生了追加问题。。

“在A窗口对应的类实现中的按钮事件方法中,以A窗口的变量x值去构造ClassWndB的一个实例”

这个具体如何实现啊。。。

按钮1 的函数是:
void CUIDlg::OnBut ...
我操,MFC什么的最让我感觉青春黑暗无比了。。。。
你这样用线程的话,我建议还是认认真真思考第二种方案。
如果一定要用第一种方案,那么AfxBeginThread是有第二个参数的,请自己看MSDN,但明确说这样用从结构角度不好,纯属堆代码完成项目功能。


另外,我建议先通读阅读《设计模式》再写程序,我上面说的2种方案细节都没说得很全很详细,在这本书中你可以找到所有答案,更彻底更完全,即使不做码农,此书也可以在哲学角度对你的人生也有意义,书也不厚,2周可破。。。http://book.douban.com/subject/1052241/

[ 本帖最后由 SONIC3D 于 2013-6-30 01:15 编辑 ]



本帖最近评分记录
  • lizitaisha 激骚 +6 感谢分享 2013-6-30 23:02

TOP

引用:
原帖由 shixn 于 2013-6-30 01:46 发表

AfxBeginThread函数有2种形式,工作者线程是有第二个参数的,UI多线程木有,所以比较伤脑筋……
CWinThread* AfxBeginThread(
   AFX_THREADPROC pfnThreadProc,
   LPVOID pParam,
   int nPriority = THREAD ...
看花眼了,以为你用了第一种
对于第二种AfxBeginThread,要往创建的CWinThread的派生类中加入成员变量并且设置,有两种方法
一种是AfxBeginThread调用的时候dwCreateFlags设为CREATE_SUSPENDED,之后置成员变量后再Resume
另一种是直接写一个CWinThread派生类的构造,然后调用CWinThread的CreateThread,而不是用AfxBeginThread。


如果赶工或者作业,那的确可以用消息队列完成,窗口B句柄在

CWinThread::m_pMainWnd和

CWinThread::m_pActiveWnd


如果是要长期维护下去的,建议还是好好设计好否则就是给自己挖坑,早晚给埋了。



TOP

发新话题
     
官方公众号及微博