调用一个采集的C++库,用的双缓冲,因为采样率8k,所以每16ms其中一个缓存满可以取数。
我的做法是建一个线程一,线程中代码大致:while(!terminate)
{
  while(flag0)//取缓存0的状态,直到提示缓存已满
  {
    Thread.Sleep(1);
  }
  //取数,入队列
  
  while(flag1)//取缓存1的状态,直到提示缓存已满
  {
    Thread.Sleep(1);
  }
  //取数,入队列
  
}另开线程二对队列中的数据进行处理,比如存盘,但是发现数据有丢失。
线程一的优先级已经设为最高了,我该咋整啊?

解决方案 »

  1.   

    你flag0和flag1分开到2个线程里去处理啊,和在一起会影响对方的。
      

  2.   

    前面的描述有点问题,应该是这样的while(!terminate)
    {
      while(flag==1)//当flag为1,表示缓存0已满,目前正在写缓存1
      {
        getflag();
        Thread.Sleep(1);
      }
      //取缓存0中的数据,入队列
      
      while(flag==0)//缓存1已满
      {
        getflag();
        Thread.Sleep(1);
      }
      //取缓存1中的数据,入队列
      
    }
    所以不能简单地分成两个线程吧
      

  3.   

    那我请问,flag为多少代表2个缓存都未满?flag为多少代表2个缓存同时满了?
    你考虑过这种情况吗?缓存1先满,flag=0,而在很短的时间(0.0001ms)以内,缓存0也满了,flag=1,但是这样你就以为缓存1未满。
      

  4.   

    flag只有0,1两个值。数据交替放两个缓存,缓存0满了后,就存缓存1,flag为1,1满了再去存0,flag为0。这些都是dll写死了我无法更改,正常情况下写满一个缓存需要16ms,所以必须在16ms内将缓存的数据取出,否则数据就会丢,我该如何做才能保证数据不丢?
      

  5.   

    看起来好像录音,如果是录音那应该有另一种回调的方式。
    如果不是录音,你这个写法的问题在于当flag==1时,你处理完了,此时flag没变成0,还是1,继续下一次循环又进入了1处理了一遍相同的数据。
      

  6.   

    测试下你线程中从while(flag==0)到while(flag==1)之间的时间间隔,还有整个循环的间隔,能否保证你的处理一定也能在14ms之内完成(排除两头的sleep的时间)