监测仪采集一个正弦信号,然后通过socket发送给PC,在采样频率较低时是可以正常显示的,但是高频时就显示不对了,只显示了很短一部分,而且还很乱。
我在接收数据后面加了 一个sleep(3000),图像就能正常显示了,大家帮忙分析一下可能是怎么回事呢?

解决方案 »

  1.   

    是每接收完一次数据sleep(3000),就能正常显示,搞不清楚为什么会这样
      

  2.   

    //接收数据线程
    接收数据
    sleep(3000);
    PostMessage();//通知绘图线程刷新图像
      

  3.   

    如果你不Sleep,cpu都让接收线程占了,绘图线程当然就工作不正常了
    另外数据一定要保存起来,数组,链表,队列都可以,
    接收线程只管接收,保存数据,不作处理
    绘图线程就取数据显示就行了
      

  4.   

    对 你让接受套接字接受玩指定的数据后 发送一个消息给绘图线程 这样可以提高cpu的使用效率的吗
      

  5.   

    To Conry:
    首先谢谢你的回复!
    你说的cpu都让接收线程占了,其实我也怀疑这一点,但是我采用的是线程同步机制,怎么会有CPU被接收线程占用这个问题呢?
    我的线程同步是这样设计的:三个线程:
    UINT Recvdata(LPVOID pParam)
    UINT Storedata(LPVOID pParam)例外一个绘图线程是用的主线程UINT Recvdata(LPVOID pParam)
    {
       while(1)
              {
                  WaitForMultipleObjects(2, Finish, true, INFINITE); 
                  //开始接收数据
                    //接收完毕
                    EventStore.SetEvent();//设置 保存线程有信号
                    PostMessage();//通知绘图线程刷新图像
              }
    }其中
    HANDLE Finish[]={EventDrawed,EventStored};//绘图、保存都结束
      

  6.   

    然后在保存线程中,
    UINT Storedata(LPVOID pParam)
    {
            while(1)
           {
        WaitForSingleObject(EventStore, INFINITE); //等待EventStore有信号
                     }
            EventStored.SetEvent();//设置EventStored有信号 
    }
      

  7.   

    绘图是在OnPaint()函数中:
    void CGraphDlg::OnPaint() 
    {
         //开始绘图
          //绘图完毕
          EventDrawed.SetEvent();//设置EventDrawed有信号 
    }然后一个消息响应函数OnRecvDataOK响应接收线程中发过来的刷新的消息,刷新界面
    LRESULT CGraphDlg::OnRecvDataOK(WPARAM wParam, LPARAM lParam)
    {
          Invalidate();//刷新    
    }
      

  8.   

    我这样分包可以吗?不好意思,没做过分包
    for( j=0; j<recvdatalen/4; j++)
    {
    *(pShareBuf+j) = *(ptmp+j);
    }
    for( j=recvdatalen/4+1; j<recvdatalen/2; j++)
    {
    *(pShareBuf+j) = *(ptmp+j);
    }
    for( j=recvdatalen/2+1; j<recvdatalen*3/4; j++)
    {
    *(pShareBuf+j) = *(ptmp+j);
    }
    for( j=recvdatalen*3/4+1; j<recvdatalen; j++)
    {
    *(pShareBuf+j) = *(ptmp+j);
    }                                         //把pShareBuf发送出去
      

  9.   

    我刚才测试了一下,还是不行啊,你看看我这样写对吗?定义了一个全局的dataPart,用来记录分割的数据块。
    我把接收到的数据分成了4块
    然后分四次发送出去
    for( j=(recvdatalen/4)*dataPart; j<(recvdatalen/4)*dataPart+recvdatalen/4; j++)
    {
    *(pShareBuf+j) = *(ptmp+j);
    }
    dataPart++;
                                            //发送数据当dataPart=0时,发送第一块,以此类推保存线程里面for( i=(recvdatalen/4)*(dataPart-1); i<(recvdatalen/4)*(dataPart-1)+recvdatalen/4; i++)
    {
    *(pStoreBuf_M1_C1+i) = *(pShareBuf_M1_C1+i);
    }

    while(dataPart==5)
    {
                        dataPart=0;每次接收的数据都放入一个数组中,当4次接收完之后,再进行保存处理。不知是我哪里操作的不对,感觉程序运行结果跟原来的没啥两样,到底哪里还有问题呢?
      

  10.   

    明显是你的绘图线程效率太低你每收到一次数据就PostMessage给绘图线程
    当你绘图线程中绘图函数所需的运行时间大于PostMessage的间隔时间的话,当然显示效果会紊乱解决办法只有两个:1、在PostMessage之间Sleep
    2、优化绘图函数算法,降低其时间复杂度2才是根本的解决办法
      

  11.   


    不是吧
    我测过接收、保存、绘图三个部分的运行时间,频率20khz\保存时间10s:(显示、保存不正常)recv:700ms左右
    draw:150ms左右
    store:280ms左右
    PostMessage时间间隔:1700ms
    频率200hz\保存时间10s:(显示、保存正常)recv:13000ms左右
    draw:120-150ms左右
    store:70ms左右
    PostMessage时间间隔:20000ms
    有一点你说的很正确,就是在postMessage之前Sleep(3000),确实是可以显示、保存出来(虽然有部分数据丢失)。但是你说,是由于绘图时间过长,大于PostMessage,这个我测量过,应该不会是这个问题吧?还请多多指教,谢谢
      

  12.   

    感觉你的线程同步逻辑有些乱你的DrawEvent和StoreEvent都只调用过SetEvent方法,没调用过ResetEvent方法
    这两个信号量岂不是一直有信号的???