我想写一个Worker Thread,在该线程完成一功能时需要通知指定窗口,让窗口完成后续工作,我想通过Worker Thread投寄一条用户消息到指定窗口,触发窗口处理程序。
 请问如何定义、使用该用户自定义的用户消息来完成我所想的功能。                                         不胜感激

解决方案 »

  1.   

    ::PostMessage(...)只要你的线程传递参数有了原来窗口的东西就行了
    调用
    DWORD dwThreadID;
    m_hCommThread = CreateThread( NULL, 0, ThreadProc, this, 0, &dwThreadID );//注意this
    传回
    DWORD CComm::ThreadProc( LPVOID lpParam )
    {
    CComm *pThis = ( CComm * )lpParam; DWORD dwEvents, dwBytesRead; while( pThis->m_bCommOpen )
    {
    if( WaitCommEvent( pThis->m_hComm, &dwEvents, NULL ) )
    {
    if( dwEvents == EV_RXCHAR )
    {
    dwBytesRead = pThis->ReadCommBlock( pThis->m_byteBuffer, 1024 );
    if(dwBytesRead)
    {
    ResetEvent( pThis->m_hEvBufferEmpty );
    ::PostMessage( pThis->m_MainWindow, UM_DATAARRIVAL, 0, dwBytesRead );
    WaitForSingleObject( pThis->m_hEvBufferEmpty, INFINITE );
    }
    }
    }
    else
    {
    if( GetLastError() != 995 )
    pThis->ShowError();
    //AfxMessageBox( "后台线程错误, [GetLastError() != 995]", MB_OK, MB_ICONSTOP );
    return 0;
    }
    }
    return 1;
    }
      

  2.   

    改正一下
    ::PostMessage( pThis->m_hWnd, UM_DATAARRIVAL, 0, dwBytesRead );
      

  3.   

    在一个都能到达的头文件里写
    1.#define WM_MY_MSG (WM_USER + 0x100) //这里这个值自己定了
    2.然后再窗口类里添件函数LRESULT MyMsgProc(WPARAM,LPARAM);
    3.然后再窗口的映射里(BEGIN_MESSAGE_MAP后面,END_MESSAGE_MAP前面 )
    加上一行ON_MESSAGE(WM_MY_MSG,MyMsgProc)
    4.加上MyMsgProc的代码
    在窗口类CPP里加上
    LRESULT MyWnd::MyMsgProc(WPARAM w,LPARAM l)
    {
    //do something
    return NULL;
    }
    5.然后在线程相应地方加上
    ::PostMessage(hWnd,WM_MY_MSG,NULL,NULL);
    //其中hWnd是要传递信息的窗口句并,想办法传进线程久可以了
      

  4.   

    大概如下:
    假设你的窗口类名为CHandWnd;
    你在你的窗口类中定义一个用户消息,假设为
    #define WORKER_FINISHED (WM_USER + 0x01)然后,在你的窗口类定义中加入如下的函数定义
    protected:
    void OnWorkerFinished(WPARAM wParam,LPARAM lParam);
    同时,在你的窗口类实现的.cpp文件中加入
    void CHandWnd::OnWorkerFinished(WPARAM wParam,LPARAM lParam)
    {
       // 此处添加你自己的窗口处理程序
       return;
    }
    同时,在.cpp文件的
    BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间加入如下语句:
    ON_MESSAGE(WORKER_FINISHED,OnWorkerFinished)
    .
    ok,当你的线程工作完后,通过sendmessage向你的窗口发送消息:消息号就是上面定义的WORKER_FINISHED,如果没有要传递的参数,随便在发送时填写一个值就可以了,一般建议填写0.
    祝你好运!^_^
      

  5.   

    http://www.codeproject.com/threads/usingworkerthreads.asp
      

  6.   

    http://www.codeproject.com/useritems/workerthread.asp
    http://www.codeproject.com/threads/sync.asp
    http://www.codeproject.com/threads/cthread.asp
      

  7.   

    jennyvenus(JennyVenus)说得对,我也是这样干的,不过要记住,千万不要将对话框给提前干掉了
      

  8.   

    http://www.csdn.net/expert/topic/543/543238.xml?temp=.8249933
      

  9.   

    在我举的例子中,头文件要添上
    afx_msg LRESULT OnDataArrival( WPARAM wparam, LPARAM lparam );
    .cpp的消息映射中要添上
    ON_MESSAGE( UM_DATAARRIVAL, OnDataArrival )
    最后要实现类似于我的
    OnDataArrival函数
      

  10.   

    gateh(幻影) 
    的隐射函数类型错了