以CWinThread类为基类建立CGUIThread类
在Inistance函数中添加如下代码
    CWnd* pWnd=new CWnd();
    pWnd->CreateEx(0,
            AfxRegisterWndClass( CS_HREDRAW|CS_VREDRAW|CS_BYTEALIGNCLIENT,0,(H
BRUSH)m_Brush) ,
            "gui thread window",
            WS_OVERLAPPEDWINDOW|WS_VISIBLE|WS_POPUP|WS_BORDER|WS_SYSMENU,
            CRect(0,0,100,100),
            NULL,
            0);
    m_pMainWnd=pWnd;
想问的是:
如果要对这个线程发送消息,是使用PostThreadMessage()发送给m_Thread(CGUIThread m
_Thread;),还是PostMessage()发送给m_pMainWnd?
如果PostThreadMessage可行,创建m_pMainWnd还有什么用呢?真诚请教!!!!

解决方案 »

  1.   

    那得看你发消息是要干什么了PostThreadMessage只是发送到线程消息队列中,并且所发消息并没有跟窗口联系到一起,也就是说,通过PostThreadMessage发的消息不可能被dispatch到窗口函数中.你只能在消息循环里getmessage后进行处理.(一般也很少用到这个函数的,我们发消息一般都是发到窗口函数用来实现某个功能的.)而postmessage给窗口的话,你可以在窗口函数中进行处理
      

  2.   

    我只是想实现:
    向CGUIThread类发送消息,不管是PostMessage还是PostThreadMessage,不要求每个消息得到顺序执行,但是要求所有的消息都要执行。也就是说,发送10遍消息,就要执行10遍相应的消息处理代码!!
    多谢关注!!
      

  3.   

    无论哪种方法都可以达到你的目的!
    只是用PostThreadMessage的话,你的消息处理函数必须在消息循环那里处理.因为用这个函数发的消息没有hwnd,不可能被调度到窗口函数那里再执行.所以你还是先问自己发消息是为了做什么,这些消息是想自己处理还是交给系统处理.
      

  4.   

    同意 _foo(void)            //莫名函数:) 。不管调用postthreadmessage,还是postmessage,线程都会产生消息队列。但是如果创建的不是ui线程,用postthreadmessage的时候要小心。msdn这么说的,
    The thread to which the message is posted must have created a message queue, or else the call to PostThreadMessage fails. Use one of the following methods to handle this situation: Call PostThreadMessage. If it fails, call the Sleep function and call PostThreadMessage again. Repeat until PostThreadMessage succeeds. 

    究竟该怎么做,还是象_foo所说的,先问自己发消息是为了做什么,这些消息是想自己处理还是交给系统处理.
      

  5.   

    还是想再问一下:
    PostThreadMessage和PostMessage有什么不一样的地方吗?建立并启动一个UI线程,在Inistance函数中建立自己的窗口
    CWnd* pWnd=new CWnd();
    pWnd->CreateEx(0,
    AfxRegisterWndClass( CS_HREDRAW|CS_VREDRAW|CS_BYTEALIGNCLIENT,0, (HBRUSH)m_Brush) ,
    "DEMO THREAD WINDOW",
    WS_OVERLAPPEDWINDOW|WS_VISIBLE|WS_POPUP|WS_BORDER|WS_SYSMENU,
    CRect(100,100,200,200),
    NULL,
    0);
    m_pMainWnd=pWnd;在主对话框程序的一个按钮点击响应函数中添加代码:
    向这个UI线程使用PostThreadMessage连续发送10次消息,消息处理函数的内容是
    弹出一个Message对话框,按确定退出!
    结果UI线程的窗口上出现一个MB_OK类型的Message对话框!
    如果我现在改变主对话框程序按钮点击响应函数的代码改为发送次数一次,其他不变.然后把UI线程消息处理函数的内容改成向主对话框使用PostMessage连续发送10次消息,消息处理函数的内容和UI线程一样,都是弹出一个Message对话框(MessageBox(hWnd,"content","caption",MB_OK)!!),结果主对话框上出现10个MB_OK类型的Message对话框!实在不知道怎么回事啊!!
    请教!
      

  6.   

    问题似乎清楚了些!!
    不是PostThreadMessage的错,
    我把UI线程中消息处理函数代码由:
    int Num=(int)wparam;
    count++;
    TRACE("\nDEMO::ncount=%d",count);
    for(int i=0;i<10;i++)
    {
    dlg->PostMessage(WM_THREADMSS1,0,0);
    MessageBox(m_pMainWnd->m_hWnd,"Num:%d","DEMOTHREAD",MB_OK);
    }
    return 0;换成 int Num=(int)wparam;
    count++;
    TRACE("\nDEMO::ncount=%d",count);
    for(int i=0;i<10;i++)
    {
    dlg->PostMessage(WM_THREADMSS1,0,0);
    MessageBox(AfxGetApp()->m_pMainWnd->m_hWnd,"Num:%d","DEMOTHREAD",MB_OK);
    }
    return 0;就会弹出10个的MB_OK形式MessageBox对话框,只不过位置在主对话框的位置上?!!!奇怪,难道UI线程的m_pMainWnd和主对话框的m_pMainWnd不一样吗?
    求教!!!!!!
      

  7.   

    问题似乎清楚了些!!
    不是PostThreadMessage的错,
    我把UI线程中消息处理函数代码由:
    int Num=(int)wparam;
    count++;
    TRACE("\nDEMO::ncount=%d",count);
    for(int i=0;i<10;i++)
    {
    dlg->PostMessage(WM_THREADMSS1,0,0);
    MessageBox(m_pMainWnd->m_hWnd,"Num:%d","DEMOTHREAD",MB_OK);
    }
    return 0;换成 int Num=(int)wparam;
    count++;
    TRACE("\nDEMO::ncount=%d",count);
    for(int i=0;i<10;i++)
    {
    dlg->PostMessage(WM_THREADMSS1,0,0);
    MessageBox(AfxGetApp()->m_pMainWnd->m_hWnd,"Num:%d","DEMOTHREAD",MB_OK);
    }
    return 0;就会弹出10个的MB_OK形式MessageBox对话框,只不过位置在主对话框的位置上?!!!
               ~~~~~~~~~不对,好像还是不行啊!!
    郁闷,有人知道这是为什么吗?
      

  8.   

    唉,汗!
    其实这个m_pMainWnd主窗口句柄嘛,
    那句m_pMainWnd = pWnd;你不加程序也能正常运行,只是你在其他的地方就不能用m_pMainWnd了,你这样相当于给m_pMainWnd负值,没其它什么意思的
      

  9.   

    其实我也是刚学VC不久,很多VC里面的道道都不是很清楚!
    还想再问问:
    为什么在Inistance中不建立窗口,线程对发送给它的消息就无动于衷啊?
    在VCWizzard中不是已经建立了消息队列了吗?已经有了DECLARE_MESSAGE_MAP,和BEGIN_MESSAGE_MAP...了吗?
    不解中....
      

  10.   

    俺现在已经发现问题是在:
    如果不在Inistance中建立窗口,线程一起动就退出了,并不是发送消息没有响应!
    还是不解啊!
    请大侠们赐教!!!