多线程中::SendMessage()遇到的怪问题
Hi!
我在编多线程程序时,遇到了用::SendMessage()把线程结束的消息发回原来的调用窗口会在release版中出violent access的错误,而在debug版中没有。我是过了改Project Settings,改成过Multithreaded DLL, multithreaded, DEBUG multithreaded, etc.还试改General为MFC DLL和MFC static,都是在同样的地方出错。出错的地方经过删加代码定位为::SendMessage()那一句。我用的cwnd.sendmessage的成员函数也出了错。我把消息处理函数改成空函数还是错,反正就是Sendmessage就要Violent access.
后来干脆把接受消息的窗口的消息处理函数改成public直接调用,居然可以用了!请问这是问什么呀?
我的线程是这样的:
UINT GenerateSliceThread(LPVOID param)
{
ThreadInfo* pInfo = (ThreadInfo*)param;
//DO SOMETHING ...
//pInfo->pvCaller->OnGenerateThreadEnded();
::PostMessage(pInfo->hwCaller, WM_GENERATE_THREAD_END, NULL, NULL); // ERROR HERE!!! BUT WHY? 已经定位为这一句出了错
//::SendMessage(), 或者CWnd.Sendmessage, CWnd.PostMessage同样错
return 829; // unreachable, in fact
}
这个ThreadInfo 的定义是这样的:
struct ThreadInfo { // this structure carries the information provided to the thread GenerateSliceThread
HWND hwCaller; // HWND of the VIEW
CNNViewBase* pvCaller; // the VIEW that requested the calculation of slice.
};
我开始线程的代码是:
ThreadInfo * info = &...;
info->hwCaller = pDemander->GetSafeHwnd();//hwCaller和pvCaller其实是同一个对象
info->pvCaller = pDemander;
this->ptGenerating = ::AfxBeginThread(GenerateSliceThread, info);
WM_GENERATE_THREAD_END 定义为WM_USER +1, 还试过改成WM_USER +100,WM_APP + 1都不行。