MFC中使用worker thread的问题

sdssly 2009-08-04 03:32:18
我的app使用MFC的doc/view架构,能否这样使用worker thread
在View的类中的函数中 AfxBeginThread(TestFunction, this);

TestFunction是一个全局函数,开启一个thread 通过传递的this指针来得到view类
UINT TestFunction(LPVOID pParam)
{
int iFindItem = 0;
stBPData bpdata;
BOOL bRet = FALSE;
SYSTEMTIME systime;
CString LineContent;

CDXXXView *pClass = (CEDoctorView *)pParam;


这样我就可以在thread中访问view类中的变量了 我总是感觉这样使用不很正常,不知道大家是怎么使用的??
...全文
125 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gg606 2009-08-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 visualthinking 的回复:]
引用 9 楼 gg606 的回复:
最好是传窗口句柄而不是窗口指针,因为“你不能依赖于对象的持续存在。。。”(MSDN里有说明)



我觉得是可以依赖的,销毁窗口之前有足够的时间去做线程清理工作,传指针是可以的。
[/Quote]

关于MFC,我想还是微软更清楚一些。
robertcarlos 2009-08-06
  • 打赏
  • 举报
回复
reinterpret_cast
sdssly 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 alicehyxx 的回复:]
引用 6 楼 heksn 的回复:
需要注意的就是同步问题


Up,如果传入的线程的参数是不变的,可以用一个数据类封装需要的数据,然后new一个数据类的对象,把这个指针传入线程能安全点。
[/Quote]

我现在传入线程函数的就是当前View的一个指针,使用this来表示的 当前程序运行时 这个this指针应该永远有效并且是不便的吧? 你说的new 一个对象传入是什么意思??
周成风 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 heksn 的回复:]
需要注意的就是同步问题
[/Quote]

Up,如果传入的线程的参数是不变的,可以用一个数据类封装需要的数据,然后new一个数据类的对象,把这个指针传入线程能安全点。
visualthinking 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gg606 的回复:]
最好是传窗口句柄而不是窗口指针,因为“你不能依赖于对象的持续存在。。。”(MSDN里有说明)


[/Quote]
我觉得是可以依赖的,销毁窗口之前有足够的时间去做线程清理工作,传指针是可以的。
gg606 2009-08-05
  • 打赏
  • 举报
回复
最好是传窗口句柄而不是窗口指针,因为“你不能依赖于对象的持续存在。。。”(MSDN里有说明)

  • 打赏
  • 举报
回复
需要注意的就是同步问题
togoblime 2009-08-04
  • 打赏
  • 举报
回复
如果还有其它线程使用CDXXXView,还要注意线程的同步
togoblime 2009-08-04
  • 打赏
  • 举报
回复
放心吧,这样使用没有问题,因为所有的线程共享进程的地址空间。但要注意两个问题
1.保证CDXXXView销毁后TestFunction不再访问它
2.谨慎使用AfxGetMainWnd,FromHandle等函数,它可能会返回临时对象
visualthinking 2009-08-04
  • 打赏
  • 举报
回复
对m_XXX成员的访问,pClass->m_XXX
sdssly 2009-08-04
  • 打赏
  • 举报
回复
我的类的名称就是CDXXXView 程序中是否应该这样使用?
UINT TestFunction(LPVOID pParam)
{
int iFindItem = 0;
stBPData bpdata;
BOOL bRet = FALSE;
SYSTEMTIME systime;
CString LineContent;
CDXXXView *pClass = (CDXXXView *)pParam;

我担心的是这样使用thread 是否OK ?? 其他人怎么使用thread访问其他数据的
visualthinking 2009-08-04
  • 打赏
  • 举报
回复
将CDXXXView *pClass = (CEDoctorView *)pParam;
改为CDXXXView *pClass = (CDXXXView *)pParam;
而且,CEDoctorView 的声明 中应该包含一个CDXXXView类型的成员m_DXXXView

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧