hello,d_stranz.here questions come.
in samplingThread.cpp,I add these code:
void SamplingThread::sample(double elapsed)
{
const QPointF s
(elapsed, value
(elapsed
));
const QPointF s2
(elapsed, value2
(elapsed
));
SignalData::instance().append(s,s2);
}
double SamplingThread::value2(double timeStamp) const
{
const double period = 1.0 / 5.0;//here 5.0 is the frequency
const double x = ::fmod(timeStamp, period);
bool bEven = ( int(x) % 2 == 0 ? true : false );
if ( bEven )
v = 400.0;//400.0 is the amplitude
else
v = 0;
return v;
}
void SamplingThread::sample(double elapsed)
{
const QPointF s(elapsed, value(elapsed));
const QPointF s2(elapsed, value2(elapsed));
SignalData::instance().append(s,s2);
}
double SamplingThread::value2(double timeStamp) const
{
const double period = 1.0 / 5.0;//here 5.0 is the frequency
const double x = ::fmod(timeStamp, period);
bool bEven = ( int(x) % 2 == 0 ? true : false );
if ( bEven )
v = 400.0;//400.0 is the amplitude
else
v = 0;
return v;
}
To copy to clipboard, switch view to plain text mode
then I make changes in signaldata.h,signadata.cpp,curvedata.h and curvedata.cpp.
signaldata.h:
#ifndef _SIGNAL_DATA_H_
#define _SIGNAL_DATA_H_ 1
#include <qrect.h>
class SignalData
{
public:
static SignalData &instance();
void append
(const QPointF &pos,
const QpointF
&pos2
);
void clearStaleValues(double min);
int size() const;
void lock();
void unlock();
private:
SignalData();
SignalData(const SignalData &);
SignalData &operator=( const SignalData & );
virtual ~SignalData();
class PrivateData;
PrivateData *d_data;
};
#endif
#ifndef _SIGNAL_DATA_H_
#define _SIGNAL_DATA_H_ 1
#include <qrect.h>
class SignalData
{
public:
static SignalData &instance();
void append(const QPointF &pos,const QpointF &pos2);
void clearStaleValues(double min);
int size() const;
QPointF value(int index) const;
QPointF value2(int index) const;
QRectF boundingRect() const;
void lock();
void unlock();
private:
SignalData();
SignalData(const SignalData &);
SignalData &operator=( const SignalData & );
virtual ~SignalData();
class PrivateData;
PrivateData *d_data;
};
#endif
To copy to clipboard, switch view to plain text mode
signaldata.cpp:
#include "signaldata.h"
#include <qvector.h>
#include <qmutex.h>
#include <qreadwritelock.h>
class SignalData::PrivateData
{
public:
PrivateData():
boundingRect(1.0, 1.0, -2.0, -2.0) // invalid
{
values.reserve(1000);
}
{
values.append(sample);
values2.append(squarewave);
// adjust the bounding rectangle
if ( boundingRect.width() < 0 || boundingRect.height() < 0 )
{
boundingRect.setRect(sample.x(), sample.y(), 0.0, 0.0);
}
else
{
boundingRect.setRight(sample.x());
if ( sample.y() > boundingRect.bottom() )
boundingRect.setBottom(sample.y());
if ( sample.y() < boundingRect.top() )
boundingRect.setTop(sample.y());
}
}
QVector<QPointF> values;
QVector<QPointF> values2;
QMutex mutex;
// protecting pendingValues QVector<QPointF> pendingValues;
QVector<QPointF> pendingValues2;
};
SignalData::SignalData()
{
d_data = new PrivateData();
}
SignalData::~SignalData()
{
delete d_data;
}
int SignalData::size() const
{
return d_data->values.size();
}
QPointF SignalData
::value(int index
) const {
return d_data->values[index];
}
QPointF SignalData
::value2(int index
) const {
return d_data->values2[index]
}
QRectF SignalData
::boundingRect() const {
return d_data->boundingRect;
}
void SignalData::lock()
{
d_data->lock.lockForRead();
}
void SignalData::unlock()
{
d_data->lock.unlock();
}
void SignalData
::append(const QPointF &sample,
const QPointF &squarewave
) {
d_data->mutex.lock();
d_data->pendingValues += sample;
d_data->pendingValues += squarewave;
const bool isLocked = d_data->lock.tryLockForWrite();
if ( isLocked )
{
const int numValues = d_data->pendingValues.size();
const QPointF *pendingValues
= d_data
->pendingValues.
data();
const QPointF *pendingValues
= d_data
->pendingValues2.
data();
for ( int i = 0; i < numValues; i++ )
d_data->append(pendingValues[i],pendingValues2[i]);
d_data->pendingValues.clear();
d_data->pendingValues2.clear();
d_data->lock.unlock();
}
d_data->mutex.unlock();
}
void SignalData::clearStaleValues(double limit)
{
d_data->lock.lockForWrite();
d_data
->boundingRect
= QRectF(1.0,
1.0,
-2.0,
-2.0);
// invalid
const QVector<QPointF> values = d_data->values;
const QVector<QPointF> values2= d_data->values2;
d_data->values.clear();
d_data->values2.clear();
d_data->values.reserve(values.size());
d_data->values2.reserve(values2.size());
#if 0
int index;
for ( index = values.size() - 1; index >= 0; index-- )
{
if ( values[index].x() < limit )
break;
}
if ( index > 0 )
d_data->append(values[index++]);
d_data->append2(values2[index++]);
while ( index < values.size() - 1 )
d_data->append(values[index++]);
d_data->append2(values2[index++]);
#endif
d_data->lock.unlock();
}
SignalData &SignalData::instance()
{
static SignalData valueVector;
return valueVector;
}
#include "signaldata.h"
#include <qvector.h>
#include <qmutex.h>
#include <qreadwritelock.h>
class SignalData::PrivateData
{
public:
PrivateData():
boundingRect(1.0, 1.0, -2.0, -2.0) // invalid
{
values.reserve(1000);
}
inline void append(const QPointF &sample,const QPointF &squarewave)
{
values.append(sample);
values2.append(squarewave);
// adjust the bounding rectangle
if ( boundingRect.width() < 0 || boundingRect.height() < 0 )
{
boundingRect.setRect(sample.x(), sample.y(), 0.0, 0.0);
}
else
{
boundingRect.setRight(sample.x());
if ( sample.y() > boundingRect.bottom() )
boundingRect.setBottom(sample.y());
if ( sample.y() < boundingRect.top() )
boundingRect.setTop(sample.y());
}
}
QReadWriteLock lock;
QVector<QPointF> values;
QVector<QPointF> values2;
QRectF boundingRect;
QMutex mutex; // protecting pendingValues
QVector<QPointF> pendingValues;
QVector<QPointF> pendingValues2;
};
SignalData::SignalData()
{
d_data = new PrivateData();
}
SignalData::~SignalData()
{
delete d_data;
}
int SignalData::size() const
{
return d_data->values.size();
}
QPointF SignalData::value(int index) const
{
return d_data->values[index];
}
QPointF SignalData::value2(int index) const
{
return d_data->values2[index]
}
QRectF SignalData::boundingRect() const
{
return d_data->boundingRect;
}
void SignalData::lock()
{
d_data->lock.lockForRead();
}
void SignalData::unlock()
{
d_data->lock.unlock();
}
void SignalData::append(const QPointF &sample,const QPointF &squarewave)
{
d_data->mutex.lock();
d_data->pendingValues += sample;
d_data->pendingValues += squarewave;
const bool isLocked = d_data->lock.tryLockForWrite();
if ( isLocked )
{
const int numValues = d_data->pendingValues.size();
const QPointF *pendingValues = d_data->pendingValues.data();
const QPointF *pendingValues = d_data->pendingValues2.data();
for ( int i = 0; i < numValues; i++ )
d_data->append(pendingValues[i],pendingValues2[i]);
d_data->pendingValues.clear();
d_data->pendingValues2.clear();
d_data->lock.unlock();
}
d_data->mutex.unlock();
}
void SignalData::clearStaleValues(double limit)
{
d_data->lock.lockForWrite();
d_data->boundingRect = QRectF(1.0, 1.0, -2.0, -2.0); // invalid
const QVector<QPointF> values = d_data->values;
const QVector<QPointF> values2= d_data->values2;
d_data->values.clear();
d_data->values2.clear();
d_data->values.reserve(values.size());
d_data->values2.reserve(values2.size());
#if 0
int index;
for ( index = values.size() - 1; index >= 0; index-- )
{
if ( values[index].x() < limit )
break;
}
if ( index > 0 )
d_data->append(values[index++]);
d_data->append2(values2[index++]);
while ( index < values.size() - 1 )
d_data->append(values[index++]);
d_data->append2(values2[index++]);
#endif
d_data->lock.unlock();
}
SignalData &SignalData::instance()
{
static SignalData valueVector;
return valueVector;
}
To copy to clipboard, switch view to plain text mode
curvedata.h:
#include <qwt_series_data.h>
#include <qpointer.h>
class SignalData;
class CurveData: public QwtSeriesData<QPointF>
{
public:
const SignalData &values() const;
SignalData &values();
virtual QPointF sample
(size_t i
) const;
virtual size_t size() const;
virtual QRectF boundingRect
() const;
};
class CurveData2: public QwtSeriesData<QPointF>
{
public:
const SignalData &values2() const;
SignalData &values2();
virtual QPointF sample
(size_t i
) const;
virtual size_t size() const;
virtual QRectF boundingRect
() const;
};
#include <qwt_series_data.h>
#include <qpointer.h>
class SignalData;
class CurveData: public QwtSeriesData<QPointF>
{
public:
const SignalData &values() const;
SignalData &values();
virtual QPointF sample(size_t i) const;
virtual size_t size() const;
virtual QRectF boundingRect() const;
};
class CurveData2: public QwtSeriesData<QPointF>
{
public:
const SignalData &values2() const;
SignalData &values2();
virtual QPointF sample(size_t i) const;
virtual size_t size() const;
virtual QRectF boundingRect() const;
};
To copy to clipboard, switch view to plain text mode
curvedata.cpp:
#include "curvedata.h"
#include "signaldata.h"
const SignalData &CurveData::values() const
{
return SignalData::instance();
}
const SignalData &CurveData2::values2() const
{
return SignalData::instance();
}
SignalData &CurveData::values()
{
return SignalData::instance();
}
SignalData &CurveData2::values2()
{
return SignalData::instance();
}
QPointF CurveData
::sample(size_t i
) const {
return SignalData::instance().value(i);
}
QPointF CurveData2
::sample(size_t i
) const {
return SignalData::instance().value2(i);
}
size_t CurveData::size() const
{
return SignalData::instance().size();
}
QRectF CurveData
::boundingRect() const {
return SignalData::instance().boundingRect();
}
#include "curvedata.h"
#include "signaldata.h"
const SignalData &CurveData::values() const
{
return SignalData::instance();
}
const SignalData &CurveData2::values2() const
{
return SignalData::instance();
}
SignalData &CurveData::values()
{
return SignalData::instance();
}
SignalData &CurveData2::values2()
{
return SignalData::instance();
}
QPointF CurveData::sample(size_t i) const
{
return SignalData::instance().value(i);
}
QPointF CurveData2::sample(size_t i) const
{
return SignalData::instance().value2(i);
}
size_t CurveData::size() const
{
return SignalData::instance().size();
}
QRectF CurveData::boundingRect() const
{
return SignalData::instance().boundingRect();
}
To copy to clipboard, switch view to plain text mode
I compile it then the error come in signaldata.h:QQ截图20120416120826.jpg
I don't know how to do,the program drive me insane.
Bookmarks