在对话框窗口的确认按键事件中起了一个线程,向该窗口发送消息但窗口始终不能接收。哪位好心人帮我看看。
代码如下:
线程声明.h
static UINT MyThread(LPVOID lpstr);.cppvoid CTestThreadDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
//AfxBeginThread(MyThread,this);

AfxBeginThread(MyThread,this);
Sleep(10);
OnOK();
}
UINT CTestThreadDlg::MyThread(LPVOID lpstr)
{
CTestThreadDlg* pDlg;
pDlg=(CTestThreadDlg*)lpstr;
::PostMessage(pDlg->m_hWnd,WM_CHAR,0x30,NULL);
 Sleep(100);
return 0;

}void CTestThreadDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default CDialog::OnChar(nChar, nRepCnt, nFlags);
}

解决方案 »

  1.   

    最好不好在非线程间传递CWnd*
      

  2.   

    可以考虑HWND
    AfxBeginThread(MyThread,this);
    Sleep(10);
    OnOK();Sleep blocked the main thread,
      

  3.   

    CTestThreadDlg::MyThread(LPVOID lpstr)线程最好不要用类里面的成员函数,不然会有很多问题的,你试试用全局的函数试试。
      

  4.   

    AfxBeginThread(MyThread,this);
    Sleep(10);
    OnOK();// 可能此时主窗口已经退出了
      

  5.   

    你传送CWnd指针是极其错误的做法。MFC不是线程安全的库,它的内部有一个map类,负责将hwnd映射到对象,这个map类是保存在tls中的,线程切换后,不能保证传进来的CWnd指针指向的对象在本线程的tls中依然存在,跨线程必须传递句柄。
      

  6.   

    另,不要调用OnOk试试,sleep(10)不能保证你的线程一定在退出之前发送消息。有可能发送消息的时候主窗口已经销毁(虽然CDialog类的对象可能还存在)。