CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  进程/线程/DLL

一执行到PostThreadMessage程序就退出,为何?

楼主suncom_zhu(乐也)2004-08-04 14:52:18 在 VC/MFC / 进程/线程/DLL 提问

现有线程_pThreadA和_pThreadB,在_pThreadA中实现获取_pThreadB中传递的MSG:  
   
  MSG     msg;  
  GetMessage(&msg,NULL,0,0);  
   
   
  在线程B中一旦执行到这面这句时:  
   
  _pThreadA->PostThreadMessage((UINT)SEND_MSG,  
  (WPARAM)&_SendMsg,  
  (LPARAM)sizeof(&_SendMsg));  
   
  程序没有任何提示就自动关闭。为何? 问题点数:100、回复次数:15Top

1 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-08-04 15:20:47 得分 0

因为你传递的是一结构的指针,等线程接收到消息时,线程B可能又在发送下消息了,这样的程序的栈很可能在此刻已经破坏了,需要在两线之间加入同步机制,保护你发送数据不被破坏。Top

2 楼suncom_zhu(乐也)回复于 2004-08-04 15:30:41 得分 0

但现在是_pThreadB中只执行了一次PostThreadMessage,且一执行到PostThreadMessage时就退出.Top

3 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-08-04 15:54:00 得分 20

将上下相关的代码帖点出来。Top

4 楼suncom_zhu(乐也)回复于 2004-08-04 16:20:18 得分 0

_pThreadA对应的线程函数:  
  UINT   CThread::ThreadA_Fun(LPVOID   Arg)  
  {  
  MSG   msg;  
  int   ret;  
   
  for(;;)  
  {  
  /*   Get   Message   */  
  ret   =   GetMessage(&msg,NULL,0,0);  
   
  if(ret==0){  
  AfxMessageBox("失败");  
  continue;  
  }else{  
  AfxMessageBox("成功");  
  }  
   
  /*   Process   Message   */  
  switch(msg.message)  
  {  
  case   SEND_MSG:  
  //process...  
  break;  
  default:  
  break;  
  }  
  }  
  return   0;  
  }  
   
   
  _pThreadB对应的线程函数:  
   
  UINT   CThread::ThreadB_Fun(LPVOID   Arg)  
  {  
  int   TimeOutArg   =   *(int*)(Arg);  
  long     ret;  
   
  /*_SendMsg赋值*/  
   
  ret   =   _pThreadA->PostThreadMessage((UINT)SEND_MSG,  
  (WPARAM))&_SendMsg  
  (LPARAM)sizeof(_SendMsg));  
   
  if(ret   !=   0){  
  AfxMessageBox("POST成功");  
  }  
  else{  
  AfxMessageBox("POST失败");  
  }  
   
  return   0;  
   
  }Top

5 楼niu_a(阿牛)回复于 2004-08-04 16:41:20 得分 15

在case   SEND_MSG:  
  //process...  
  加个断点看看Top

6 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2004-08-04 16:44:52 得分 0

_SendMsg是什么样的?Top

7 楼microyzy(人不在牛,分高就行;分不在高,人牛也行)回复于 2004-08-04 16:47:49 得分 15

建议同楼上,加个断点,调试一下看看是由于那个线程的错误而退出的,估计是内存溢出或者指针无效之类的错误  
  找到确切的退出语句,就好办了Top

8 楼zhenbe(一头栽在C里面)回复于 2004-08-04 16:50:10 得分 0

不知你的   _SendMsg是何变量?你传递地址,而且有用Post,唉,比死无疑。  
  看你的代码,_SendMsg   好像还是局部变量,你又传地址出去,等收到消息,地址早无效了!Top

9 楼msdn_user(蓝天)回复于 2004-08-04 16:51:06 得分 0

_SendMsg应该是动态分配的  
  否则等SEND_MSG消息被处理的时候  
  _SendMsg可能已经被系统回收  
  不能存取了Top

10 楼suncom_zhu(乐也)回复于 2004-08-04 17:09:05 得分 0

_SendMsg是全局变量  
  static   SEND_MSG   _SendMsg;//  
  SEND_MSG   是结构Top

11 楼suncom_zhu(乐也)回复于 2004-08-04 17:43:55 得分 0

- _pThreadA 0x00000000   {CWinThread   h=???   proc=???}  
  CCmdTarget CXX0030:   Error:   expression   cannot   be   evaluated  
  + classCWinThread {"CWinThread"}  
  m_pMainWnd CXX0030:   Error:   expression   cannot   be   evaluated  
  m_pActiveWnd CXX0030:   Error:   expression   cannot   be   evaluated  
  m_bAutoDelete CXX0030:   Error:   expression   cannot   be   evaluated  
  m_hThread CXX0030:   Error:   expression   cannot   be   evaluated  
  m_nThreadID CXX0030:   Error:   expression   cannot   be   evaluated  
  m_nDisablePumpCount CXX0030:   Error:   expression   cannot   be   evaluated  
  + m_msgCur {msg=???   wp=???   lp=???}  
  m_pThreadParams CXX0030:   Error:   expression   cannot   be   evaluated  
  m_pfnThreadProc CXX0030:   Error:   expression   cannot   be   evaluated  
  m_lpfnOleTermOrFreeLib CXX0030:   Error:   expression   cannot   be   evaluated  
  m_pMessageFilter CXX0030:   Error:   expression   cannot   be   evaluated  
  + m_ptCursorLast {x=???   y=???}  
  m_nMsgLast CXX0030:   Error:   expression   cannot   be   evaluated  
  + &_SendMsg 0x006058c8   _SendMsg  
  + _SendMsg {...}  
  ret -858993460Top

12 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-08-04 18:27:28 得分 0

会不会是直接传递结构对象有问题呢?Top

13 楼kufan(我是真的不会表达我的爱)回复于 2004-08-05 09:14:54 得分 0

_SendMsg在堆中生成试试。Top

14 楼footway(靠边行走)回复于 2004-08-05 09:58:40 得分 0

static   SEND_MSG   _SendMsg;//  
  _SendMsg是静态变量,能行吗?Top

15 楼zhenbe(一头栽在C里面)回复于 2004-08-07 12:44:28 得分 50

CThread   是继承于CWinThread的吗?如果是,则不需要你来GetMessage(...),直接用ON_MESSAGE(),如果不是,你打算自己写消息泵,则使用PostThreadMessage(   ThreadID,   MSG,...)直接使用API,不要_pThreadA->PostThreadMessage(。。。),试试看,祝你好运!Top

相关问题

  • 为什么adocommand执行完后,程序无故自动退出?
  • 有没有在form中程序退出时执行的事件
  • 在Formcreate中执行application.Terminate,为什么程序没有退出?
  • 如何在程序退出后再执行另一外部程序?
  • 退出程序
  • 奇怪的内存泄漏。语句没有执行。程序就退出了。why?????
  • 如何在系统退出前让程序执行特定的操作?
  • 为什么程序能执行到ExitInstance但是还是不能退出来。
  • 编译成debug程序运行正常,但编译成release程序一执行就退出了
  • 可执行程序

关键词

  • 线程
  • 执行
  • 消息
  • pthreada
  • postthreadmessage
  • sendmsg
  • pthreadb
  • msg
  • expression cannot
  • 退出

得分解答快速导航

  • 帖主:suncom_zhu
  • DentistryDoctor
  • niu_a
  • microyzy
  • zhenbe

相关链接

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

广告也精彩

反馈

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