最近看一个国外大牛的文章, 有类似如下的代码:
CMyView 是从CView中派生出来的Viewvoid CMyView:: doSomethingLengthy()
{
。。
_beginthread(myWorkerThread,0, (PVOID)this); //注意:是把整个view对象作为参数传递进去了
}(static) void CMyView::myWorkerThread(PVOID pvoid)
{
CMyView* me = (CMyView*)pvoid;
me->run();}void CMyView::run()
{
//在这里做真正的工作,并可以直接使用CMyView中的成员变量和方法。
。。
}请问这样做有没有问题,疑问如下?
把MFC的CMyView对象直接做为线程参数传递?我记得很多书上说这样是应该避免的,应该把该mfc对象对应的句柄传进去,否则很可能出错。我的理解是: 在CMyView::run()方法中,可以使用自定义的成员变量和方法,只要该方法没有进行MFC界面相关的操作,如果跟界面相关的操作,仍然需要用postmessage之类的方法通过消息来操作。否则很有可能出问题。 也就是说在run()中的调用CMyView类相关的方法要非常小心,并不是绝对安全的。
我的理解对不对?如果我的理解没问题,是不是上面程序的写法不是一个很好的风格?
CMyView 是从CView中派生出来的Viewvoid CMyView:: doSomethingLengthy()
{
。。
_beginthread(myWorkerThread,0, (PVOID)this); //注意:是把整个view对象作为参数传递进去了
}(static) void CMyView::myWorkerThread(PVOID pvoid)
{
CMyView* me = (CMyView*)pvoid;
me->run();}void CMyView::run()
{
//在这里做真正的工作,并可以直接使用CMyView中的成员变量和方法。
。。
}请问这样做有没有问题,疑问如下?
把MFC的CMyView对象直接做为线程参数传递?我记得很多书上说这样是应该避免的,应该把该mfc对象对应的句柄传进去,否则很可能出错。我的理解是: 在CMyView::run()方法中,可以使用自定义的成员变量和方法,只要该方法没有进行MFC界面相关的操作,如果跟界面相关的操作,仍然需要用postmessage之类的方法通过消息来操作。否则很有可能出问题。 也就是说在run()中的调用CMyView类相关的方法要非常小心,并不是绝对安全的。
我的理解对不对?如果我的理解没问题,是不是上面程序的写法不是一个很好的风格?
解决方案 »
- 经纬度如何转换成米?急啊~~
- vc + ODBC + sql server 的问题
- ★★★请教关于Windows系统内部的结构化异常处理对程序的执行效率的影响问题,请高手谈谈!!★★★
- 一个UDP小问题
- OpenGL中一个跟缺省坐标轴一致的立方体,给定前进方向,怎样通过三次旋转,使它与地面(通过X,Y,Z坐标来反映)平行,也就是紧贴地面,
- 谁有《深入解析ATL》这本书的例子源码?这本书的英文名叫ATL Internals.
- 怎样判断某个路径是一个文件夹而不是一个文件?
- jpeglib只把数据输出到FILE*里,请问可以在内存里模拟一个iostream吗?
- 从菜单项以命令响应的形式弹出的对话框可以做成停靠框吗?
- 刚看到“深圳急缺软件人才”一文,,,,,,,,
- vs2005的c++单元测试
- 为什么我的死跑不起来,在win7上的VS2005可以,我的WinXP的2008不行..
可以看看run里的代码。里面应该不涉及到消息处理相关的东西当然不赞同直接操作界面
把MFC的CMyView对象直接做为线程参数传递?我记得很多书上说这样是应该避免的,应该把该mfc对象对应的句柄传进去,否则很可能出错。
===========
这种做法经常见到,一般也不会出现问题,但是不推荐用。主要的原因可以还是传入线程的指针失效的问题吧,建议传句柄,然后发消息之类的进行处理。
我个人认为指针比句柄还要更方便有效,我就经常这样用,相当于从外部推动View,没什么不好吧。
通常在一个进程里View类都是持久有效,不会出问题。
=================================================================分明是个指针吗。
mfc的指针在线程里是不安全的,难度不是么?