CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

多线程内在处理问题

楼主skyfine(柳荣宏)2005-01-25 15:30:07 在 VC/MFC / 进程/线程/DLL 提问

有两个线程A和B.在线程A里new   obj,然后把&obj传给线程B,线程B能否正确读出obj的值.如果不行,有什么方法呀! 问题点数:50、回复次数:15Top

1 楼Hendy_So(横笛)回复于 2005-01-25 15:46:22 得分 0

可以。Top

2 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-01-25 15:48:20 得分 10

只要保证变量的生命期,就可以访问Top

3 楼beyound(我知道为什么总让我重新登陆)回复于 2005-01-25 15:55:14 得分 5

oyljerry(☆勇敢的心☆→㊣Project   Coding㊣)讲得专业,试试在线程外部声明全局的obj。Top

4 楼skyfine(柳荣宏)回复于 2005-01-25 16:25:53 得分 0

那么接下就是这个问题了  
   
  A:  
  for   (   ;   ;   )  
  {  
      pobj   =   new   obj;  
      ...  
      PostThreadMessage(g_nBid,MY_MSG,(WPARAM)pobj,(LPARAM)sizeof(obj));  
   
  }  
   
  B:  
  for   (   ;   ;   )  
  {  
        读obj里的内容;  
        delete   (obj*)msg.wParam;  
  }  
   
  这样做行不行呀!是否可以释放?Top

5 楼soullover()回复于 2005-01-25 16:53:19 得分 5

应该没有问题,但是要主要在两个线程退出时注意同步,否则可能发生内存泄漏Top

6 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-01-25 16:54:07 得分 0

最好在一个编译单元中申请空间和释放空间,这才是好的编程规范Top

7 楼skyfine(柳荣宏)回复于 2005-01-25 17:37:11 得分 0

何谓一个编译单元?Top

8 楼bug2k(bug2k)回复于 2005-01-25 17:56:01 得分 0

这样做小程序可以,如果程序大了,这样写程序调试会累死你。  
  还是用全局变量来做数据交换比较好,哪怕浪费一些空间。Top

9 楼XXandOO(麦猪)回复于 2005-01-25 18:08:05 得分 20

何谓一个编译单元?  
  {}  
  如果你这样写,即A知道PostThreadMessage调用会造成obj释放,之后最好pobj   =   0;Top

10 楼lpschenshengxue(陈生学)回复于 2005-01-25 18:40:17 得分 0

upTop

11 楼Biecheny(漏网的鱼自由自在)回复于 2005-01-25 19:51:52 得分 0

分配一块公用内存Top

12 楼skyfine(柳荣宏)回复于 2005-01-27 14:30:11 得分 0

为什么不用全局变量?  
   
  看下面的  
  static   obj   g_obj;定义全局  
  //////////////////////////  
  A:  
  for(   ;   ;   )  
  {  
          g_obj   =   a;//g_obj的值为a  
          PostThreadMessage(g_nBid,MY_MSG,(WPARAM)&g_obj,(LPARAM)sizeof(obj));//传给B  
  }  
   
  B:  
  msg   b_msg;  
  for   (   ;   ;   )  
  {  
        b_msg   =   getmsg();               //从消息队列中读一个消息  
        read(b_msg.wParam);           //从b_msg中读传过来的值;  
        delete   (obj*)b_msg.wParam  
  }  
   
  如果某次B线程循环一次花1秒钟,而同时A线程只花了0.1秒钟,也就是B的消息队列中会有10个消息,如果用全局的话,这10个消息的内容会完全相同,因为每次传值的地址都是全局变量的地址.  
   
  因为我对VC/MFC也不熟,很多功能都没用,只能用一些掌握的东西,来处理程序,希望有更好的方法!Top

13 楼skyfine(柳荣宏)回复于 2005-01-27 16:17:20 得分 0

顶Top

14 楼tide2355(疾风之狼)回复于 2005-01-28 16:10:03 得分 10

如果这块数据可以封装到类里面  
  把它封装成类的静态成员变量吧,尽量少用全局,  
  我基本上都是这样用的  
  Class   X  
  {  
  public:   static   type   m_obj;  
        CRITICAL_SECTION   m_cs;  
  }  
   
  type   X::m_obj;  
  BOOL   X::SetObj(type   *pobj)  
  {  
      if(pobj   ==   NULL)   return   FALSE;  
      EnterCriticalSectioin(&m_cs);  
      m_obj   =   *(   type*)pobj;  
      LeaveCriticalSection(&m_cs);  
  }  
   
  线程A  
  X   x   =   new   X  
  x->SetObj();  
  delete   x;  
   
  线程B  
  X   x   =   new   X  
  x->SetObj();  
  delete   x;Top

15 楼AntonlioX(做人要厚道)回复于 2005-05-21 22:00:43 得分 0

upTop

相关问题

  • Pro *C编程,多线程处理
  • PRO*C多线程处理问题
  • 300分求 多线程处理问题!?
  • 多线程问题处理。请教
  • 关于多线程异常处理
  • 多线程处理socket通讯带来的问题!!!!!
  • 多线程只有在多处理机上才有效,对?
  • 在pb中如何实现多线程处理
  • 请教一个在多线程下的数据处理问题?
  • 关于多线程处理---难道又是编译器问题?

关键词

  • 线程
  • 消息
  • 全局
  • setobj
  • pobj
  • 变量
  • obj
  • postthreadmessage
  • msg
  • wparam

得分解答快速导航

  • 帖主:skyfine
  • oyljerry
  • beyound
  • soullover
  • XXandOO
  • tide2355

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo