我觉得2个线程就可以了,一个采集数据写入buffer,一个数据分析。两个线程要同步,buffer满了就送去分析,分析完了再写。

解决方案 »

  1.   

    Picker, Analyser1个线程Picker流程如下:while 1:
      pick up data
      if (data is null or stop?)
          break;  write buffer
      if (buffer is full)
      {
         Dispatch buffer to Analyser
         Empty buffer
      }
      

  2.   

    补充:
    如果必须保持Picker和Analyser同步, 当buffer is full, 可为Analyser再开一个线程,
      

  3.   

    两个线程即可。读写buffer是两个线程都要用的功能,封装成函数供线程调用,无需独立使用线程,但是要使用同步对象。
      

  4.   

    1,串口采集
    2,数据分析
    3. GUI
      

  5.   

    "读写buffer是两个线程都要用的功能,封装成函数供线程调用,无需独立使用线程,但是要使用同步对象。"
    这个是啥子意思?用全局函数?另外,补充一下,并非buffer full了才进行数据analysis,而是采集到一条完整的data之后就进行analysis,此时buffer有可能是满的也有可能不是满的。再扩展一下,如果这时候是多个串口需要采集呢?谢谢!
      

  6.   

    可以不是全局函数。例如把缓冲区封装成一个类CBuffer,提供Read和Write方法,因为方法是被多线程调用的,方法内部使用同步对象对线程进行同步。主线程创建一个类实例,例如CBuffer buf;其它线程可以直接访问buf的方法。
      

  7.   

    多谢,不好意思,能否再详细说一下其他线程怎么调用这个buf的方法呢?新手,不好意思。
    是传buf的指针给其他线程吗?
      

  8.   

    是的,作为子线程入口参数,在CreateThread的时候,将指针传进去。// 线程安全的Buffer类
    class SyncBuf
    {....};// 子线程入口函数
    DWORD WINAPI startFunc(LPVOID lpParam);
    {
        SyncBuf *pBuf = (SyncBuf*)lpParam;
        // pBuf->Read(); pBuf->Write();
    }// 主线程
    SyncBuf buf;
    CreateThread(NULL, 0, startFunc, (LPVOID)&buf, 0, 0);
    建议3个线程的方案。理由:
    GUI最好用单独的一个线程,因为如果是图形用户界面,响应速度是必须要保证的。如果跟其他操作合伙儿用1个线程,也许用户在按按钮的时候,线程正在忙着做分析,没时间响应,表现为“卡机”现象。
    数据采集和分析分开,为的是及时能采集到串口上的数据,防止串口上数据丢失的情况。串口自身的buffer可能很小,如果不及时采集,有可能满,从而丢失数据或旧数据被覆盖。
      

  9.   

    Buffer类内部的实现,可以用循环队列来做,建议楼主看看“生产者-消费者”问题,跟这个类似的。
    采集到数据以后,怎样通知分析线程:可以使用Semaphore来实现。多个串口:
    仍然可以使用3线程方案。采集数据仍用1个线程来做。因为采集数据只涉及到数据的读写操作,单线程轮询应该速度够了。
    线程开多了,速度也不一定能上去,因为活跃线程数>CPU数后,线程切换造成的开销会增大,得不偿失。