crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Проблема с правильным завершением дополнительного потока
AD
  опции профиля:
сообщение 12.9.2008, 16:52
Сообщение #11


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

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

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




Репутация:   17  


Немного изменил. Все-равно ломается, во-первых, правда, в другом месте.
Подскажите, пожалуйста, где ошибка.
Правка произошла в функции run:
/// Запуск дополнительного потока
void DTThread::run()
{
    m_terminated.lock();
    while(!w_terminated.wait(&m_terminated, 0))
    {
        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);
        }
    }

    w_terminated.wakeAll();
    m_terminated.unlock();
    exec();
}

Соответственно w_termainated.wakeAll() перенесена в run()!
Я уже запутался, где ошибка.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.9.2008, 11:14
Сообщение #12


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

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

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




Репутация:   17  


Поправил немного. Но все-равно, работает кривовато. Причем глюки очень разнообразные: то график отображается параметра, который выбран не в данный момент, а во время предыдущей выборке, то совсем не отображается, то застревает на этапе выборки. Может быть сможете подсказать, где копнуть, чтобы поправить это безобразие?
thread

GraphicDisplay::GraphicDisplay(QWidget *parent): QDialog(parent)
{
    p_thread = new DTThread;
}

GraphicDisplay::GraphicDisplay(QWidget *parent, ParamPlotSettings& st): QDialog(parent)
{
    p_thread = new DTThread;
}

GraphicDisplay::~GraphicDisplay()
{
    delete rubber;
    delete contextMenu;

    if(timer)
    {
        timer -> stop();
        delete timer;
    }
    if(p_thread)
    {
        p_thread -> quit();
        if(p_thread -> isRunning()) p_thread -> terminate();
        delete p_thread;
    }
}

/// Отрисовка графика
void GraphicDisplay::paintEvent(QPaintEvent* events)
{
    painter.begin(this);

    painter.setWindow(paramsDisplay -> rect());
    painter.setFont(QFont("Tahoma", 8, Qt::SolidLine));
    painter.setPen(Qt::black);

    if(gridAction -> isChecked()) drawGrid(&painter);
    drawCurves(&painter);

    if(timer != 0) if(curveMap.size() == fact_prm.size())
        timer -> stop();

    painter.end();
}

/// Заполнение вектора данными
void GraphicDisplay::fillCurve()
{
      p_thread -> clearCurveMap();
      p_thread -> rw_run.unlock();
}

/// Инициализация нужных для потока параметров
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);

    p_thread -> rw_run.lockForRead();
    p_thread -> start();

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(forUpdate()));
    timer -> start(UPDATETIME);
}

/// Обновление данных списка
void GraphicDisplay::forUpdate()
{
    if(p_thread -> rw_run.tryLockForRead())
    {
        curveMap = p_thread -> CurveMap();
        update();
    }
}

/// Закрытие окна
void GraphicDisplay::closeEvent(QCloseEvent* events)
{
    QDialog::closeEvent(events);
    if(p_thread)
    {
        if(p_thread -> isRunning()) p_thread -> terminate();
        p_thread -> quit();
    }
    if(timer)
        timer -> stop();
}



/// Запуск дополнительного потока
void DTThread::run()
{
    m_terminated.lock();
    while(!w_terminated.wait(&m_terminated, 0))
    {
        int id = 0;
        /// Заполнение данными по оси x
        fillXVec(data);

        for(fact_param_iter fit=fact_prm.begin(); fit!=fact_prm.end(); ++fit, ++id)
        {
            m_terminated.unlock();
            /// Заполнение данными по оси 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);
            m_terminated.lock();
        }
    }

    m_terminated.unlock();
    exec();
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 19.9.2008, 10:11
Сообщение #13


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


Извини, правда некогда разбираться. :(
Но, если ты таки хочешь работать с потоками, стоит самому разобраться - я же твою прогу писать не буду. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 19.9.2008, 11:01
Сообщение #14


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

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

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




Репутация:   17  


Не знаю уж чего я там еще такого наваял, но пока вроде бы работает без багов! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.11.2024, 6:51