从缓冲区读取时丢失双倍数据

时间:2019-05-11 03:45:52

标签: qt

我用QSemapore编写了一个双缓冲区数据采集和读取程序。当我运行它时,我发现它无法从缓冲区读取双倍数据。从缓冲区读取的数据是一个较大的随机数。当我将数据类型从double更改为int时,它可以正常读取数据。我的主要代码如下:

mythread.cpp:

     const int BufferSize = 10;
     double buffer1[BufferSize];
     double buffer2[BufferSize];
     int curBuf=1; //The Buffer currently being written
     int bufNo=0; //the NO of buffer

     //quint8   counter=0;    
     double   counter=0;    //generate a data

     QSemaphore emptyBufs(2);
     QSemaphore fullBufs;

     void QThreadDAQ::run()
    {
          m_stop=false;//Start the thread, m_stop=false
          bufNo=0;
          curBuf=1; //current buffer
          counter=0;

          int n=emptyBufs.available();

        if (n<2)  //Make sure the thread starts emptybufs.available ==2
             emptyBufs.release(2-n);

        while(!m_stop)
        {
            emptyBufs.acquire();                   //get an empty buffer
            for(int i=0;i<BufferSize;i++)          //generate data
        {
           if (curBuf==1){
               buffer1[i]=counter;                 //write data
           qDebug()<<"buffer1"<<buffer1[i];
        } else{
            buffer2[i]=counter;
            qDebug()<<"buffer2"<<buffer2[i];
        }
        counter=counter+1.4145987; 
        msleep(100); 
    }

    bufNo++;
    if (curBuf==1)                    // change current buffer
      curBuf=2;
    else
      curBuf=1;
     fullBufs.release(); 
     }
   quit();
   }

void QThreadShow::run()
 {
     m_stop=false;

     int n=fullBufs.available();
     if (n>0)
        fullBufs.acquire(n);

     while(!m_stop)
    {
        fullBufs.acquire(); 

    //    int bufferData[BufferSize];
    double bufferData[BufferSize];
    int seq=bufNo;

    if(curBuf==1) 
        for (int i=0;i<BufferSize;i++){
           bufferData[i]=buffer2[i];                //copy data
           qDebug()<<"bufferData[i]"<<bufferData[i];
        }else
        for (int i=0;i<BufferSize;i++){
           bufferData[i]=buffer1[i];
           qDebug()<<"bufferData[i]"<<bufferData[i];
        }

       emptyBufs.release();                        //release an empty buffer
       emit newValue(bufferData,BufferSize,seq);   //send data to mainwindow
     }
         quit();
     }

mainwindow.cpp

      ui(new Ui::MainWindow)
       {
           ui->setupUi(this);
           connect(&threadConsumer,SIGNAL(newValue(double *,int,int)),
           this,SLOT(onthreadB_newValue(double *,int,int)));
       }



      void MainWindow::onthreadB_newValue(double *bufferData, int 
      count, int bufNo)
      {
             QString str = QString("No. %1 buffer")
             .arg(bufNo);

       for(int i=0;i<count;i++)
       {
          str=str+QString::asprintf("%d,",*bufferData);
          bufferData++;
       }
       str=str+"\n";
        ui->plainTextEdit->appendPlainText(str);    //print the data
    }

然后我打印buffer1,buffer2,bufferdata的数据。它们是正确的。 我不知道我的代码有什么问题。您能告诉我如何解决此问题吗?谢谢!!!!!

0 个答案:

没有答案