我用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的数据。它们是正确的。 我不知道我的代码有什么问题。您能告诉我如何解决此问题吗?谢谢!!!!!