我现在做的项目和你这个差不多,我采集线程把DDC信号做FFT后,发送给一个dispatch线程根据设定频率分割给不同的子窗口做显示。我的做法是在dispatch线程里保存一个最新的副本,run函数wait一个条件变量,如果副本发生变化,我就做处理,否则就等待。程序结构大概是这样的。
class TDispatchThread : public QThread
{
public:
void Start();
void Stop();
void dispatch( float *fft, uint32_t length );
protected:
void waitForChange();
void run();
//关闭标志
bool m_close;
//fft 锁
QMutex m_lock;
// 条件变量
QWaitCondition m_wait;
float *m_FFT_Buffer; //buffer used by IF spectrum FFT
bool m_Changed;
};
后面简单的写一下处理过程
// ddc 采集线程调用该方法
void TDispatchThread::dispatch(float * fft , uint32_t length )
{
m_lock.lock();
memcpy(m_FFT_Buffer,fft,length * sizeof(float));
....其它一些操作
m_Changed = true;
//通知所有等待的条件变量
m_wait.wakeAll(); m_lock.unlock();
}
//等待更新信号
void TDispatchThread::waitForChange()
{
m_lock.lock();
while(!m_Changed)
m_wait.wait(&m_lock);
m_lock.unlock();
}
//线程处理过程
void TDispatchThread::run()
{
while(!m_close)
{
//等待新数据
waitForChange();
m_lock.lock();
//加入数据处理过程
m_Changed = false;
m_lock.unlock();
}
}
大概就这样,ddc采集线程包含dispatch线程,ddc信号fft后调用dispatch方法把数据传给dispatch线程。
dispatch线程有一个QMutex 锁,用来保护fft_buffer,条件变量用来等待新的数据。关闭线程的时候需要
wait一下,等待线程结束。就这样吧。