我在主线程构造一个CAsyncSocket的派生类MySocket,调用
MySocket socket;
socket.Create();
socket.Connect("127.0.0.1", 2000);
然后在MySocket的OnConnect里设断点,可以拦截下来。服务端显示成功连接。但如果我在一个由_beginthreadex创建的线程里用同样的代码,服务端仍然显示成功连接,但OnConnect无法断下来。OnReceive等等都无法断下。请问应该怎么做?

解决方案 »

  1.   

    CAsyncSocket 是需要一个消息循环来接收事件的!
    你的是线程有吗?
      

  2.   

    个人对消息循环不是很懂,请教一下:接收不到消息是分线程收不到吧?既然是这样,为什么又可以成功连接呢?怎么才能在线程里面加入消息循环?使用MFC的线程相关的结构、函数能不能解决问题?谢谢
      

  3.   

    我现在在socket.Connect("127.0.0.1", 2000);后面加上
    MSG msg;
    if(GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    以后,就可以断下来了。那如果这个线程是无限循环的( while(true) ),那是不是每循环一次都要加上上面的消息处理?是像这样处理一次,还是要循环?那如果以后我不需要调试了,是不是可以去掉这些消息处理?这些消息处理语句对于Socket的工作有没有影响?
      

  4.   

    如果是工作线程就要加上,没有影响! 
    你可以用MFC 的界面线程!这些都处理好了.
      

  5.   

    CAsyncSocket通过及消息来处理这个,你的线程是UI线程吗?
      

  6.   

    是工作线程。我是要每过一段时间调用一些语句(比如去询问服务器状态)。在这段时间内,我要保证所有的Socket都能够正常工作,不受Sleep的影响。我现在是这样做的:
    用AfxBeginThread启动两个线程,一个是实际工作的线程,
    MSG msg;
    while (true)
    {
    if (GetMessage(&msg, NULL, 0, 0))
    {
    DispatchMessage(&msg); if (msg.message == WM_USER)
    {
    // do something
    }
    }
    else
    {
    // retrieved WM_QUIT
    break;
    }
    }
    另一个是定时器线程:
    MSG msg;
    while (true)
    {
    if (PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE))
    {
    break;
    }

    _thread->PostThreadMessage(WM_USER, 0, 0);
    Sleep(interval);
    }
    其中_thread是工作线程的CWinThread*。定时器线程每过interval时间就向工作线程发送一个WM_USER消息。工作线程收到这个消息才做事,否则只是等待消息和分派消息。这样只要interval不为0,就可以保证两个线程都不会100%占用CPU,而且可以达到我的目的。如果是那种非定时执行的线程,而是因某个事件触发工作的线程,就由事件触发者去调用_thread->PostThreadMessage(WM_USER, 0, 0);就可以了。不知道我现在这样做对不对?有没有更好的方法?