Russian Qt Forum

Qt => Вопросы новичков => Тема начата: taifun от Март 16, 2011, 16:52



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

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

Как решить проблему? 
исходники во вложении


Название: Re: библиотека qwt + thread
Отправлено: Авварон от Март 16, 2011, 17:16
мув ту тред где?


Название: Re: библиотека qwt + thread
Отправлено: taifun от Март 16, 2011, 17:21
Простите, я к сожалению даже не знаю что такое мув то тред. Поясните пожалуйста, в чем моя ошибка.


Название: Re: библиотека qwt + thread
Отправлено: Авварон от Март 16, 2011, 17:34
http://doc.qt.nokia.com/latest/qobject.html#moveToThread


Название: Re: библиотека qwt + thread
Отправлено: taifun от Март 17, 2011, 09:51
Благодарю за помощь!


Название: Re: библиотека qwt + thread
Отправлено: Akon от Март 17, 2011, 15:31
ИМХО, неправильный дизайн. Зачем в рабочем потоке (thread_data) ссылаться на всякие курвы (QwtPlotCurve), в конечном счете относящиеся к гую-компоненту QwtPlot и основному потоку?

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


Название: Re: библиотека qwt + thread
Отправлено: Авварон от Март 17, 2011, 15:48
я особо не глядел, но там нормально - по завершении работы треда кидается сигнал, что архитектурно нормально. Однако он кидался из контекста хз какого треда (эмит из треда, а цикл событий ему соответствующий - в главной нитке)


Название: Re: библиотека qwt + thread
Отправлено: Akon от Март 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() не нужен.


Название: Re: библиотека qwt + thread
Отправлено: taifun от Март 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 читал, но не вникал, думаю разберусь, но сразу хотелсь бы узнать,  как будет выглядеть это строка, но для четырехмерного массива?

Спасибо за советы!


Название: Re: библиотека qwt + thread
Отправлено: Akon от Март 18, 2011, 08:25
QVector<QVector<QVector<QVector<double> > > >