建设企业网站价格,最好的锦州网站建设,如何创建网站的步骤,网站目录生成定义信号量与缓冲区#xff1a;
const int BufferSize 8;
int buffer1[BufferSize];
int buffer2[BufferSize];
int curBuf1; //当前正在写入的Bufferint bufNo0; //采集的缓冲区序号quint8 counter0;//数据生成器QSemaphore emptyBufs(2);//信号量#xff1a;空的缓冲区…定义信号量与缓冲区
const int BufferSize 8;
int buffer1[BufferSize];
int buffer2[BufferSize];
int curBuf1; //当前正在写入的Bufferint bufNo0; //采集的缓冲区序号quint8 counter0;//数据生成器QSemaphore emptyBufs(2);//信号量空的缓冲区个数初始资源个数为2
QSemaphore fullBufs; //满的缓冲区个数初始资源为0
生产者线程
void QThreadDAQ::run()
{m_stopfalse;//启动线程时令m_stopfalsebufNo0;//缓冲区序号curBuf1; //当前写入使用的缓冲区counter0;//数据生成器int nemptyBufs.available();if (n2) //保证 线程启动时emptyBufs.available2emptyBufs.release(2-n);while(!m_stop)//循环主体{emptyBufs.acquire();//获取一个空的缓冲区for(int i0;iBufferSize;i) //产生一个缓冲区的数据{if (curBuf1)buffer1[i]counter; //向缓冲区写入数据elsebuffer2[i]counter;counter; //模拟数据采集卡产生数据msleep(50); //每50ms产生一个数}bufNo;//缓冲区序号if (curBuf1) // 切换当前写入缓冲区curBuf2;elsecurBuf1;fullBufs.release(); //有了一个满的缓冲区,available1}quit();
}
消费者线程
void QThreadShow::run()
{m_stopfalse;//启动线程时令m_stopfalseint nfullBufs.available();if (n0)fullBufs.acquire(n); //将fullBufs可用资源个数初始化为0while(!m_stop)//循环主体{fullBufs.acquire(); //等待有缓冲区满,当fullBufs.available0阻塞int bufferData[BufferSize];int seqbufNo;if(curBuf1) //当前在写入的缓冲区是1那么满的缓冲区是2for (int i0;iBufferSize;i)bufferData[i]buffer2[i]; //快速拷贝缓冲区数据elsefor (int i0;iBufferSize;i)bufferData[i]buffer1[i];emptyBufs.release();//释放一个空缓冲区emit newValue(bufferData,BufferSize,seq);//给主线程传递数据}quit();
}