基于单文档的MFC程序中,主视图类中启动一个子线程。
其中一对话框类向主视图类发送自定义消息,再由主视图类转发消息给子线程。
想请教:为什么主视图类转发的自定义消息在子线程中接收不到?

解决方案 »

  1.   

    对线程发消息用PostThreadMessage
      

  2.   

    是用PostThreadMessage给线程发消息的,可不知道为什么收到,不知道与窗口拆分有没有关系,因为题目中的对话框类不是由主视图类产生的,而是拆分窗口产生的。
      

  3.   

    知道线程的id,就可以向线程发线程消息
    线程得有GetMessage循环
      

  4.   

    线程是主视图的一个成员函数,在主视图中转发由对话框类发过来的消息。
     this->m_pGpsThread->PostThreadMessage(WM_FEATURE,NULL,NULL);
      

  5.   

    如果没有GetMessage循环就只能接收一次或者一类自定义消息?
      

  6.   

    线程可以多次接收到消息和自定义消息。
    MSG msg={0};
    while(GetMessage(&msg,NULL,0,0))
    {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
    }
    和一般窗口消息一样。
      

  7.   


    首先你必须让自己的线程变成UI线程,这个线程才会有消息队列 只要调用了CreateWIndow 或者GetMessage系统就会分配消息队列给该线程,消息队列都没有怎么接受消息
      

  8.   

    是将该消息处理的语句放在线程中的run函数是吗?小妹初学者,还望多指教.
      

  9.   

    有2种方法,一种从CWinThread派生一个类,比如CMyThread,然后
    CWinThread* AfxBeginThread(
       CRuntimeClass* pThreadClass,
       int nPriority = THREAD_PRIORITY_NORMAL,
       UINT nStackSize = 0,
       DWORD dwCreateFlags = 0,
       LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL 
    );
    创建线程,CMyThread *pThread = (CMyThread*)::AfxBeginThread(RUNTIME_CLASS(CMyThread),0);
    -------------------------
    另一种方法就是GetMessage
    UINT __cdecl ThreadProc(LPVOID lParam)
    {
    MSG msg;
    while( GetMessage(&msg, NULL, 0, 0))
    {
    switch(msg.message)
    {
    case WM_SENDFILEDATA:
    Sleep(1);
    break; case WM_RECVFILEDATA:
    Sleep(1);
    break;
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg); 
    }
    return 0;
    }