一执行到PostThreadMessage程序就退出,为何?
现有线程_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




