2015-12-14 13 views
0

У меня возникли трудности с пониманием примера осциллографа qwt. Я понимаю большую часть программы примерно, но я не могу найти связь между классом выборки и классом сюжета.Как работает класс samplingthread примера осциллографа qwt в проекте?

Похоже, что образцы диаграмм взяты из пробы выборки и предоставляются объекту QwtPlotCurve в классе сюжетов.

Однако я не могу найти связь между объектом samplingthread и сюжетным объектом. Но когда я изменяю значение частоты в объекте sampleplingthread, оно применяется и появляется на сюжетном объекте (холст).

Ниже приведена часть кода (из main.cpp). Я не совсем понял, но, пожалуйста, обратитесь к полному проекту (нужно декомпрессию, я думаю), загрузив с http://sourceforge.net/projects/qwt/files/qwt/6.1.2/.

int main(int argc, char **argv) 
{ 
QApplication app(argc, argv); 
app.setPalette(Qt::darkGray); 

MainWindow window; 
window.resize(800, 400); 

SamplingThread samplingThread; 
samplingThread.setFrequency(window.frequency()); // window.frequency()'s type is double 
samplingThread.setAmplitude(window.amplitude()); // window.amplitude()'s type is double 
samplingThread.setInterval(window.signalInterval()); // window.signalInterval()'s type is double 

window.connect(&window, SIGNAL(frequencyChanged(double)), 
    &samplingThread, SLOT(setFrequency(double))); 
window.connect(&window, SIGNAL(amplitudeChanged(double)), 
    &samplingThread, SLOT(setAmplitude(double))); 
window.connect(&window, SIGNAL(signalIntervalChanged(double)), 
    &samplingThread, SLOT(setInterval(double))); 

window.show(); 

samplingThread.start(); 
window.start(); 

bool ok = app.exec(); 

samplingThread.stop(); 
samplingThread.wait(1000); 

return ok; 
} 

наверху window.start() равен plot-> start(). и я не могу найти связь между объектом сюжета и объектом sampleplingthread. Может ли кто-нибудь объяснить эту часть для меня?

+0

Эти 'window.connect' являются сигналами и слотами, которые соединяются с более поздними данными передачи между компонентами. Если вы не знакомы с механизмом, это похоже на настройку обратных вызовов. – UmNyobe

+0

Сигналы из виджетов qwt, расположенных в MainWindows, и являются ссылкой на функцию sampleplingThread. Мой вопрос - это связь между сюжетом и выборкой. Потому что, когда переменная-член выборки переменная (например, частота) изменилась, она применяется и отображается на графике. – Jackson

+0

так что yu означает другой путь 'thread -> UI'? Этот код не показывает ничего полезного. – UmNyobe

ответ

0

Существует использование любопытного одноэлементного шаблона, основанного на классе SignalData. Прежде всего, синглтон:

class CurveData: public QwtSeriesData<QPointF> 
{ 
public: 
    const SignalData &values() const; 
    SignalData &values(); 
... 
}; 

const SignalData &CurveData::values() const 
{ 
    return SignalData::instance(); 
} 

QPointF CurveData::sample(size_t i) const 
{ 
    return SignalData::instance().value(i); 
} 

С одной стороны

Plot::Plot(QWidget *parent): 
{ 
    d_curve = new QwtPlotCurve(); 
    ... 
    d_curve->setData(new CurveData()); //singleton being used inside each curvedata 
    ... 
} 

А на другой

void SamplingThread::sample(double elapsed) 
{ 
    if (d_frequency > 0.0) 
    { 
     const QPointF s(elapsed, value(elapsed)); 
     SignalData::instance().append(s); //singleton being used 
    } 
} 

Я воздерживаюсь от использования этого примера, как это.

+0

спасибо за проверку кода. Все, что я хочу, это связь между SamplingThread и сюжетным объектом, о котором мы много говорили. Можете ли вы найти и объяснить это подробно для меня? – Jackson

+0

@ Jackson это еще не ясно, потому что я забыл добавить часть кода. Существует SignalData, скрытая с помощью signeton, которая выполняет всю магию. Где они ленивы использовать сигналы или общие объекты? Без понятия. – UmNyobe

+0

Вижу, спасибо за ответ ~! – Jackson

1

Сигнал/слот между двумя нитями заканчивается как QEvents в очереди событий Qt. Учитывая, что поток выборки создает значения очень быстро (f.e каждые 10 мс), очевидно, что это не вариант.

Таким образом, должен существовать общий буфер, где запись/чтение охраняется мьютексом - вот что такое SignalData.

Мост между SignalData и кривой выполнен CurveData, который реализует данный API. Если вам нравится, вы можете сравнить CurveData с идеей QAbstractItemModel.

Но приложение осциллографа является скорее демонстрацией, чем примером. Он показывает, что возможно при очень низком использовании ЦП (хорошо работает даже на Pi с разумным использованием ЦП) с использованием нескольких трюков.