用WSAAsyncSelect
能把socket绑定在线程窗口上么?我在线程中建立了窗口,绑定了窗口处理函数,网络事件可以在线程中用getmessage得到,但是无法自动传入线程窗口的消息处理函数,像在主线程中那样。

解决方案 »

  1.   

    只要提供了消息循环即可,调用DispatchMessage就能进入窗口过程,除非处理函数不是在窗口过程中调用的,否则一定能接收到。
      

  2.   

    既然GetMessage都收到了,就肯定是可以这样做的。看看你的消息循环和消息处理函数是怎么写的。
      

  3.   

    建立一个thread处理,WSAAsyncSelect 的socket就可以了!
      

  4.   

    WSAAsyncSelect(s, hWnd, WM_MYUSER, FD_CONNECT | FD_WRITE);=========================================
    当出现该函数关注的FD_CONNECT | FD_WRITE事件后,立刻向窗口句柄hWnd发送WM_MYUSER消息。你这种情况,可以在对话框的的宏ON_MESSAGE{}里面添加:ON_MESSAGE
    {
          WM_MYUSER      MyFun(假设这个是你的WM_MYUSER消息响应函数名)
    }
      

  5.   

    #define WM_MYMESSAGE (WM_USER + 100)  BEGIN_MESSAGE_MAP(CMyWnd, CMyParentWndClass)
         ON_MESSAGE(WM_MYUSER, MyFun)   //注册消息响应函数
      END_MESSAGE_MAP()
      

  6.   


    主线程:
    {
        createthread(mythread....);
    //这里如果用postmessage(g_ThreadhWnd,TM_START,...)的话不行(why?)
       if(0==PostThreadmessage(g_Threadid,TM_START,....)
    {
        sleep(0);
    }
    }
    子线程:
    mythread()
    {
    ......
    //建立窗口 绑定窗口消息处理函数
         createmywin();
    while (GetMessage(&msg, NULL, 0, 0))
    {
    /*必须加入这里注释的才能使消息进入线程窗口的处理函数DISPATCHMESSAGE()不能传给窗口处理函数
    if(msg.message==TM_START)
    {
    ::SendMessage(g_ThreadhWnd,TM_START,NULL,NULL);
    }*/
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    }
    }
      

  7.   

    问题:主线程为什么不能postmessage 给子线程窗口发消息?
    问题: while (GetMessage(&msg, NULL, 0, 0))
        {
            /*必须加入这里注释的才能使消息进入线程窗口的处理函数DISPATCHMESSAGE()不能传给窗口处理函数
        if(msg.message==TM_START)
        {
            ::SendMessage(g_ThreadhWnd,TM_START,NULL,NULL);
        }*/
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
            
        }
    ::SendMessage(g_ThreadhWnd,TM_START,NULL,NULL);
    后 子线程的消息处理函数被调用了,他调用了另一个函数,在那个函数里有一个临时getmessage消息循环,但是只接收到第一个WID_SOCKET消息就 退出了,然后上面这个子线程窗口消息循环就再也得不到WID_SOCKET消息了。
      

  8.   

    既然是WSAAsyncSelect,为什么还要用getmessage,难道MFC自己的消息机制不好吗?
      

  9.   

    ....
    我没学过mfc api我只是边学边用,尽量用少的知识来达到我要的效果。
    不过也不用了,恐怕我是完不成这个东西了,没时间了。结贴给分吧,自己回去琢磨琢磨