Собственно вопрос в теме. Вот код, реализующий это.
/// Класс параллельного потока для отрисовки вертикальной проекции
class VThread: public QThread
{
Q_OBJECT
private:
QDockWidget* dock_widget; ///< указатель на виджет
TLV* main_window; ///< указатель на главное окно
QVector<PARAMVALUE*> param_vec; ///< вектор указателей на значения параметра
QVector<COORDINATE> coords_vec; ///< вектор координат одной точки
double maxValY, minValY; ///< максимальное/минимальное значения по оси Y
private:
void initParamVec();
protected:
virtual void run();
public:
VThread(): maxValY(-1.0e23), minValY(1.0e23) {}
VThread(QDockWidget* _widget): dock_widget(_widget), maxValY(-1.0e23), minValY(1.0e23) {}
~VThread() {}
void setMain(TLV* mw) { main_window = mw; }
TLV* getMain() const { return main_window; }
inline VerticalGraphics* getDisplay();
};
/// Получение указателя на виджет отрисовки проекции
inline VerticalGraphics* VThread::getDisplay() { return main_window -> getDockWidget() -> getDisplay(); }
/// Инициализация вектора параметров
void VThread::initParamVec()
{
if(!vertic_param || !main_window) return;
main_window -> mutex.lock();
vector<LOGRECORD> log = main_window -> getLog();
main_window -> mutex.unlock();
if(log.empty()) return;
param_vec.clear(); coords_vec.clear();
time_t before, contin; time(&before);
main_window -> mutex.lock();
for(logI iter=log.begin(); iter!=log.end(); ++iter)
{
PARAMVALUE* p = new PARAMVALUE(iter -> GetParamValue(&main_window -> cur_rec,
vertic_param -> param_record -> Name(), vertic_param -> param_record -> Address()));
maxValY = max(p -> value, maxValY); minValY = min(p -> value, minValY);
if(main_window != 0)
{
QAssistParam assistant(&main_window -> cur_rec, *iter, &events -> eventStore());
main_window -> setFilterList(&assistant);
EVENT_NAME* evn(assistant.resultEvent());
if(evn != 0) p -> setEvent(evn);
}
param_vec.append(p);
PARAMVALUE* lt = new PARAMVALUE(iter -> GetLat(&main_window -> cur_rec));
PARAMVALUE* ln = new PARAMVALUE(iter -> GetLon(&main_window -> cur_rec));
coords_vec.append(COORDINATE(lt, ln));
time(&contin);
int delta = contin - before;
if(delta > 3)
{
getDisplay() -> getVector(param_vec);
param_vec.clear();
}
}
main_window -> mutex.unlock();
if(!param_vec.isEmpty()) { getDisplay() -> getVector(param_vec); param_vec.clear(); }
}
/// Запуск потока
void VThread::run()
{ initParamVec(); }
/// Возвращает часть прочитанных значений
void VerticalGraphics::getVector(const QVector<PARAMVALUE*>& v)
{ for(QVector<PARAMVALUE*>::const_iterator iter=v.begin(); iter!=v.end(); ++iter) param_vec.append(*iter); }
/// Запуск потока инициализации вектора параметров для вертикальной проекции
void VerticalGraphics::start()
{
if(!vrt_thread -> isRunning())
vrt_thread -> start(QThread::LowPriority);
}
//////////////////
if(!log.empty())
{ verticalProjection -> displayRelief -> start(); }
//////////////////
Посоветуйте, пожалуйста, где возможны в этом коде ошибки?
Когда смотрю в дебаггере в доп. потоке, то вижу, что вектор заполняется, в главном потоке размер вектора вижу уже нулевым.
Да. вектор QVector<> - потокозащищенный. А так практически аналог - вектора STL.
Буду благодарен за любые дельные советы.