Russian Qt Forum
Март 29, 2024, 14:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: библиотека qwt + thread  (Прочитано 6565 раз)
taifun
Гость
« : Март 16, 2011, 16:52 »

Всем доброго времени суток!
Ситуация:
     есть форма на которой располагается виджет библиотеки qwt - qwtPlot, класса QwtPlot;
     есть поток - thread_data, у этого потока есть указатель curve типа QwtPlotCurve;
     в потоке происходят вычисления, потом заполняется curve, после заполнения вызывается сигнал для отображения кривой в виджете -     
     drawCurve(QwtPlotCurve* crv).

Проблема:
    при вызове сигнала программа выдает - "Программа неожиданно завершилась."

Как решить проблему? 
исходники во вложении
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #1 : Март 16, 2011, 17:16 »

мув ту тред где?
Записан
taifun
Гость
« Ответ #2 : Март 16, 2011, 17:21 »

Простите, я к сожалению даже не знаю что такое мув то тред. Поясните пожалуйста, в чем моя ошибка.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #3 : Март 16, 2011, 17:34 »

http://doc.qt.nokia.com/latest/qobject.html#moveToThread
Записан
taifun
Гость
« Ответ #4 : Март 17, 2011, 09:51 »

Благодарю за помощь!
Записан
Akon
Гость
« Ответ #5 : Март 17, 2011, 15:31 »

ИМХО, неправильный дизайн. Зачем в рабочем потоке (thread_data) ссылаться на всякие курвы (QwtPlotCurve), в конечном счете относящиеся к гую-компоненту QwtPlot и основному потоку?

Рабочий поток выполняет вычисления, помещает результат в собственный массив данных и сигнализирует об обновлении данных, в сигнале передается указатель на данные. Основной поток по сигналу устанавливает данные на курву (есть быстрый метод без копирования QwtPlotCurve::setRawData(), если не ошибаюсь). Ну и внимательно - не забывать о возможных проблемах с синхронизацией.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #6 : Март 17, 2011, 15:48 »

я особо не глядел, но там нормально - по завершении работы треда кидается сигнал, что архитектурно нормально. Однако он кидался из контекста хз какого треда (эмит из треда, а цикл событий ему соответствующий - в главной нитке)
Записан
Akon
Гость
« Ответ #7 : Март 17, 2011, 16:30 »

О, я не заметил аттач.

Можно сделать так:
Код:
class thread_data : public QThread
{
    Q_OBJECT

public:
    explicit thread_data(QObject *parent = 0);

protected:
    void run();

signals:
    void dataReady(QVector<double> data);
};

Когда поток отработает, выбросится сигнал dataReady(const QVector<double> data). Обрабатывать сигнал асинхронно (т.е. не коннектиться с Qt::DirectConnection). Т.к. QVector<> шареный класс (implicitly shared), то по завершении потока его (поток) можно даже освободить. Т.о. клиент в своем слоте получает данные и ни от чего больше не зависит и ни за чем не следит.

Еще раз подчеркну, курвам в рабочем потоке не место (курвы имеют Pen'ы, Brush'ы - атрибуты гуя). Курвы предназначены для отрисовки, а не для хранения и транспортировки данных.

Ну и при таком простейшем сценарии в thread_data::run() exec() не нужен.
Записан
taifun
Гость
« Ответ #8 : Март 17, 2011, 17:11 »

О, я не заметил аттач.

Можно сделать так:
Код:
class thread_data : public QThread
{
    Q_OBJECT

public:
    explicit thread_data(QObject *parent = 0);

protected:
    void run();

signals:
    void dataReady(QVector<double> data);
};

Когда поток отработает, выбросится сигнал dataReady(const QVector<double> data). Обрабатывать сигнал асинхронно (т.е. не коннектиться с Qt::DirectConnection). Т.к. QVector<> шареный класс (implicitly shared), то по завершении потока его (поток) можно даже освободить. Т.о. клиент в своем слоте получает данные и ни от чего больше не зависит и ни за чем не следит.

Еще раз подчеркну, курвам в рабочем потоке не место (курвы имеют Pen'ы, Brush'ы - атрибуты гуя). Курвы предназначены для отрисовки, а не для хранения и транспортировки данных.

Ну и при таком простейшем сценарии в thread_data::run() exec() не нужен.


Я с Вами полностью согласен и QwtPlotCurve не место в вычислительном потоке, но пример тестовый (только-только начал использовать Qwt, да и чего таить и в С++, и Qt не особо силен, потому допускаю ошибки). На самом деле я так и задумал считать в одном потоке, рисовать в другом, и уже стал реализовывать, но запнулся на том, как передать четырехмерный массив и потом как с ним работать (обращаться к определенным ячейкам). Но это я разберусь, надеюсь, информация есть, надо почитать.

Ну и при таком простейшем сценарии в thread_data::run() exec() не нужен
просто смотрел как устроено. В коде видел, но что? как? зачем? и как работает? не понимал.

А вот по поводу
Цитировать
void dataReady(QVector<double> data);
, хотел спросить зарание, раз пошла такая пьянка. Про QVector читал, но не вникал, думаю разберусь, но сразу хотелсь бы узнать,  как будет выглядеть это строка, но для четырехмерного массива?

Спасибо за советы!
Записан
Akon
Гость
« Ответ #9 : Март 18, 2011, 08:25 »

QVector<QVector<QVector<QVector<double> > > >
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 22.