crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Корректное заполнение вектора в доп. потоке, как правильно это реализовать?
AD
  опции профиля:
сообщение 13.2.2009, 15:55
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Собственно вопрос в теме. Вот код, реализующий это.
/// Класс параллельного потока для отрисовки вертикальной проекции
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.

Буду благодарен за любые дельные советы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 13.2.2009, 16:18
Сообщение #2


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


здесь как я понял нет защиты (мьютекса) - так надо?
void VerticalGraphics::getVector(const QVector<PARAMVALUE*>& v)
{ for(QVector<PARAMVALUE*>::const_iterator iter=v.begin(); iter!=v.end(); ++iter) param_vec.append(*iter); }

плюс 2 рекомендации - поля класса как то обозначать, кпримеру префикс f или m_; не писать более одного оператора в строке
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 13.2.2009, 17:01
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(kuler @ 13.2.2009, 16:18) *
здесь как я понял нет защиты (мьютекса) - так надо?

плюс 2 рекомендации - поля класса как то обозначать, кпримеру префикс f или m_; не писать более одного оператора в строке

Мьютекса нет, так надо. А про поля класса и строки - это просто оформление, :). У каждого свой стиль и свой вкус! Как правило пишу в одной строке простейшие операторы. Я их вижу и мне это несильно мешает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 13.2.2009, 17:05
Сообщение #4


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(AD @ 13.2.2009, 17:01) *
так надо

но это не тот расшаренный вектор?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 19.2.2009, 10:26
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(kuler @ 13.2.2009, 17:05) *
Цитата(AD @ 13.2.2009, 17:01) *
так надо

но это не тот расшаренный вектор?

Я не понимаю твоих терминов, прости. Может быть кто-нибудь поможет как-то решить проблему? (Tonal, вся надежда на вас! :))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuler
  опции профиля:
сообщение 19.2.2009, 10:47
Сообщение #6


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(AD @ 19.2.2009, 10:26) *
Я не понимаю твоих терминов, прости

имелось в виду что в этот вектор тоже может пойти одновременно процесс записи-чтения, а он у тебя не защищен
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 9:56