Я не понимаю, почему у меня нет корректного завершения потока. Заходит в поток только при первом вызове, а соответственно рисует график только при первом выборе параметров, далее необходимо закрывать это диалоговое окошко и открывать снова- что крайне неудобно. Просьба, пожалуйста, поясните, в чем ошибки?
Ниже приведен код:
class GraphicDisplay : public QDialog, public Ui::GraphicDisplayClass
{
Q_OBJECT
private:
QMap<int, QVector<QPointF>> curveMap; ///< список всех изображаемых кривых
// куча переменных
private:
void drawGrid(QPainter* painter);
void drawCurves(QPainter* painter);
void drawLegend(QPainter* painter, QRect& rect, int& k, int id);
QPointF initXY(double& sx, double& sy);
QPointF initXY(const QPoint* scr_coor);
protected:
void paintEvent(QPaintEvent* events);
void keyPressEvent(QKeyEvent* events);
void wheelEvent(QWheelEvent* events);
void mousePressEvent(QMouseEvent* events);
void mouseMoveEvent(QMouseEvent* events);
void mouseReleaseEvent(QMouseEvent* events);
void contextMenuEvent(QContextMenuEvent* events);
void resizeEvent(QResizeEvent* events) { QDialog::resizeEvent(events); update(); }
void closeEvent(QCloseEvent* events) { QDialog::closeEvent(events); }
void showEvent(QShowEvent* events) { QDialog::showEvent(events); }
public:
GraphicDisplay(QWidget *parent = 0);
GraphicDisplay(QWidget *parent, ParamPlotSettings& st);
~GraphicDisplay();
// куча функций
void initThread(QDialDistParam* pD, QDialTimeParam* pT, PlotSettings* sts);
void fillCurve();
};
/// Инициализация нужных для потока параметров
void GraphicDisplay::initThread(QDialDistParam* pD, QDialTimeParam* pT, PlotSettings* sts)
{
p_thread -> mainWindow = mainWindow;
p_thread -> pDist = pD;
p_thread -> pTime = pT;
p_thread -> settings = sts;
p_thread -> CurveMap(&curveMap);
}
/// Заполнение вектора данными
void GraphicDisplay::fillCurve()
{
curveMap.clear();
p_thread -> start();
if(p_thread -> getStop())
p_thread -> stop();
update();
}
/// Класс параллельного потока для заполнения данными кривых графика
class DTThread: public QThread
{
Q_OBJECT
private:
QMap<int, QVector<QPointF>>* curveMap; ///< список изображаемых кривых
volatile bool stopped; ///< переменная, контролирующая начало и конец выполнения потока
QMutex mtx; ///< мьютекс для блокировки данных при работе с дополнительным потоком
public:
QPen myPen; ///< карандаш для рисования линий определенной жирности и цвета
TLV* mainWindow; ///< указатель на главное окно
QVector<QPointF> data; ///< вектор загружаемой кривой
QDialDistParam* pDist; ///< указатель на класс диалога параметров по расстоянию
QDialTimeParam* pTime; ///< указатель на класс диалога параметров по времени
PlotSettings* settings; ///< указатель на настройку для определения масштаба
private:
void fillXVec(QVector<QPointF>& data);
protected:
void run();
public:
DTThread(): stopped(false), pDist(0), pTime(0), mainWindow(0) {}
~DTThread() { mtx.lock(); stopped = true; mtx.unlock(); }
void stop() { mtx.lock(); stopped = true; mtx.unlock(); quit(); };
QMap<int, QVector<QPointF>>* CurveMap() { return curveMap; }
void CurveMap(QMap<int, QVector<QPointF>>* crv) { mtx.lock(); curveMap = crv; mtx.unlock(); }
bool getStop() { return stopped; }
};
/// Запуск дополнительного потока
void DTThread::run()
{
if(!stopped)
{
int id = 0;
/// Заполнение данными по оси x
fillXVec(data);
for(fact_param_iter fit=fact_prm.begin(); fit!=fact_prm.end(); ++fit, ++id)
{
/// Заполнение данными по оси y
ParamDescr* param_record = fit -> param_record;
int index = 0;
for(logI jter=mainWindow -> log.begin(); jter!=mainWindow -> log.end() && index!=data.size(); ++jter, ++index)
{
PARAMVALUE val = jter -> GetParamValue(&mainWindow -> cur_rec, param_record -> Name(),
param_record -> Address());
data[index].setY(val.value);
}
curveMap -> insert(id, data);
}
mtx.lock(); stopped = true; mtx.unlock();
}
exec();
}
/// Заполнение данными по оси x
void DTThread::fillXVec(QVector<QPointF>& data)
{
double x = 0.0;
ParamPlotSettings* p_set = (ParamPlotSettings*)settings;
switch(p_set -> win_type)
{
case DISTPARAM:
for(QVector<PARAMVALUE>::iterator iter=x_data.dist_x.begin(); iter!=x_data.dist_x.end(); ++iter)
{
x += (iter -> value / 1000.0);
data.push_back(QPointF(x, 0.0));
int k = 0;
switch(iter -> status)
{
case PS_FAIL:
k = pDist -> spinFault -> text().toInt();
myPen.setWidth(k);
break;
case PS_NODATA:
k = pDist -> spinNoData -> text().toInt();
myPen.setWidth(k);
break;
case PS_TEST:
k = pDist -> spinTest -> text().toInt();
myPen.setWidth(k);
break;
case PS_OK:
k = pDist -> spinNormal -> text().toInt();
myPen.setWidth(k);
break;
}
}
break;
case TIMEPARAM:
for(QVector<PARAMVALUE>::iterator iter=x_data.time_x.begin(); iter!=x_data.time_x.end(); ++iter)
{
x += (iter -> value / 60.0);
data.push_back(QPointF(x, 0.0));
int k = 0;
switch(iter -> status)
{
case PS_FAIL:
k = pTime -> spinFault -> text().toInt();
myPen.setWidth(k);
break;
case PS_NODATA:
k = pTime -> spinNoData -> text().toInt();
myPen.setWidth(k);
break;
case PS_TEST:
k = pTime -> spinTest -> text().toInt();
myPen.setWidth(k);
break;
case PS_OK:
k = pTime -> spinNormal -> text().toInt();
myPen.setWidth(k);
break;
}
}
break;
}
}
Заранее благодарен за помощь!