void OnButton1()
{
     MSG msg;
     SeedSocketMessage();
     //点击Button1往设备网口发送信息然后在循环内等待超时(大概在300毫秒~1秒内可调)或接收线程收到
     //往下发送的信息的反馈信息后往本界面线程发送(可能为PostMessage或SeedMessage)自定义消息
     //WM_CUSTOMPOSTMSG,并在循环内时不时响应界面刷新消息
     //当然接收线程不一定会收到往下发送的信息的反馈信息,或者收到往下发送的信息的反馈信息前受到设备报警信息
     int ntime = GetTickCount();   
     while(1)
     {
        if(PeekMessage(&msg,hWnd1,WM_PAINT,WM_PAINT,PM_NOREMOVE))
        {
            while(GetMessage(&msg,hWnd1,WM_PAINT,WM_PAINT))
               DispatchMessage(&msg); 
        }
        if(PeekMessage(&msg,hWnd1,WM_CUSTOMPOSTMSG,WM_CUSTOMPOSTMSG,PM_NOREMOVE))    
          //WM_CUSTOMPOSTMSG为另一线程发送(可能为PostMessage或SeedMessage)给本界面主线程的用户自定义消息
       {
            while(GetMessage(&msg,hWnd1,WM_CUSTOMPOSTMSG,WM_CUSTOMPOSTMSG))
             {
                 DispatchMessage(&msg); 
                 break;
             }
       }       if((GetTickCount() - ntime) > 300)
       {
          break;//超时跳出循环
       } 
    }
}
运行时点击主线程界面Button1按钮,在其响应往设备发送控制信息然后计时,然后在循环刷新界面并等待接收线程接收信息分解出控制信息的反馈信息后发送WM_CUSTOMPOSTMSG到主界面线程,主界面线程的响应该消息函数处理后退出循环。或如果是设备报警信息则接收线程直接写入数据库报警信息表中,或超时退出循环。大家帮分析确认一下该方法可行不?需要那些改进,发送WM_CUSTOMPOSTMSG该用PostMessage,还是SeedMessage,各有那些弊端或优缺点?分不够,另开帖再散!

解决方案 »

  1.   

    代码有点长,不过有一个问题,你在while中用GetMessage处理消息循环,而这个函数在没有消息时是阻塞的,此时,你的主线程界面无法响应。所以如果没有消息到的话,你下面的if((GetTickCount() - ntime) > 300)这一句可能执行不了。
      

  2.   

    不用自己写消息循环,点击按钮时计算出超时时间保存在成员变量里,另外添加WM_CUSTOMPOSTMSG消息的响应函数,函数中判断如果超时则跳过不做处理。PostMessage是把消息放入目标线程的消息队列,然后立即返回,可以继续执行后面的任务,不关心消息处理的结果。如程序要处理一系列同类任务,任务的处理过程可以分解成多个步骤,可以使用多线程分别处理各个步骤,线程间用PostMessage通讯。
    SendMessage是等待目标线程处理完消息后返回,可以得知处理结果,类似于函数调用。如程序要同时处理多项不同类的任务,而任务之间又存在依赖关系,可以用多线程分别处理不同的任务,通过SendMessage通讯。很多时候这两个函数都可以使用,通常选择SendMessage,因为其相对简单可靠。但需要注意,如果线程之间相互依赖则可能造成互锁,要设法避免。
      

  3.   

    SendMessage()直接发送消息到窗口过程,不经过消息队列,处理完成以后函数才返回,所以是阻塞的,同步。
    PostMessage()将该消息放入消息队列,不管是否处理该函数立即返回,非阻塞,异步。
      

  4.   

    你把getTickCount去掉 然后在while的循环里加上如下语句:

    1, 每次都sleep(1);
    2, 添加一个循环次数的count, 然后++;
    3, 判断count>300, break.
      

  5.   

    int nCount = 1;
    while(1)
      {
          if (nCount > 300)
          {
              break;
          }
          if(PeekMessage(&msg,hWnd1,WM_PAINT,WM_PAINT,PM_NOREMOVE))
          {
              while(GetMessage(&msg,hWnd1,WM_PAINT,WM_PAINT))
              DispatchMessage(&msg); 
          }
          if(PeekMessage(&msg,hWnd1,WM_CUSTOMPOSTMSG,WM_CUSTOMPOSTMSG,PM_NOREMOVE))  
          //WM_CUSTOMPOSTMSG为另一线程发送(可能为PostMessage或SeedMessage)给本界面主线程的用户自定义消息
          {
              while(GetMessage(&msg,hWnd1,WM_CUSTOMPOSTMSG,WM_CUSTOMPOSTMSG))
              {
              DispatchMessage(&msg); 
              break;
              }
          }      nCount++;
          Sleep(1);
      }
      

  6.   

    还有你的peekMessage的循环应该如下: MSG msg;
    if(PeekMessage(&msg, m_hWnd, 0, 0, PM_NOREMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);并且while(1), 只需一个. 呵呵.