Russian Qt Forum

Qt => Общие вопросы => Тема начата: zodiac от Сентябрь 24, 2007, 16:10



Название: QThread и основной поток
Отправлено: zodiac от Сентябрь 24, 2007, 16:10
threads.h
Код:
#include <QThread>
#include <QMessageBox>

class threadWeather : public QThread
{
Q_OBJECT

public:
threadWeather(QObject *parent = 0);
~threadWeather();
void run();
};

threads.cpp:
Код:
#include "threads.h"

threadWeather::threadWeather(QObject *parent) : QThread(parent)
{
}

threadWeather::~threadWeather(){
}

void threadWeather::run()
{
QMessageBox::information(0, "title", inf_stat);
exec();
}
В основном потоке (ci.h, ci.cpp) с переменной inf_stat выполняются различные операции. Как мне из этого второго потока получить (или присвоить) ей значение? Пробовал так:
class CIForm : public QMainWindow, private Ui::CIForm
{
   Q_OBJECT
public:
   QString inf_stat;
};
и
QMessageBox::information(0, "title", CIForm::inf_stat);
Но ничего не выходит. В данный момент при компиляции пишет:
threads.cpp: In member function ‘virtual void threadWeather::run()’:
threads.cpp:12: ошибка: нет декларации ‘inf_stat’ в этой области видимости
make: *** [threads.o] Ошибка 1


Название: Re: QThread и основной поток
Отправлено: WW от Сентябрь 24, 2007, 17:13
CIForm *frm;
... инициализация
frm->inf_stat


Название: Re: QThread и основной поток
Отправлено: pastor от Сентябрь 24, 2007, 18:17
0) Использовать GUI (или обращаться к нему) из неосновного потока - это ошибка.

Цитировать
In GUI applications, the main thread is also called the GUI thread because it's the only thread that is allowed to perform GUI-related operations.

QMessageBox::information(0, "title", inf_stat); - это ошибка.

1) В классе CIForm для inf_stat стелай методы доступа, например void setState(const QString &state), QString state() const; В этих методах нужно будет заюзать QMutex или QMutexLocker.

2) В классе threadWeather создать член класса CIForm *frm;

3) Доработать конструктор threadWeather:

Код:
threadWeather::threadWeather(CIForm *f, QObject *parent) 
: QThread(parent), frm(f)
{
}

4)

Код:
void threadWeather::run()
{
    QString str = frm->state();
    <do_some_thing_with_state>
    ...
}


Название: Re: QThread и основной поток
Отправлено: zodiac от Сентябрь 24, 2007, 18:19
threads.cpp: In member function ‘virtual void threadWeather::run()’:
threads.cpp:12: ошибка: нет декларации ‘CIForm’ в этой области видимости
threads.cpp:12: ошибка: нет декларации ‘frm_ci’ в этой области видимости


Название: Re: QThread и основной поток
Отправлено: zodiac от Сентябрь 24, 2007, 18:21
ИМХО Mutex мне не нужен, т.к.второстепенный поток будет делать свою функцию и не задевать остальное. (Ну т.е. задевать только 1 переменную, которая не задевается в основном потоке, но существует)
Насчет QMessageBox это я для тестирования.


Название: Re: QThread и основной поток
Отправлено: pastor от Сентябрь 24, 2007, 18:30
ИМХО Mutex мне не нужен, т.к.второстепенный поток будет делать свою функцию и не задевать остальное. (Ну т.е. задевать только 1 переменную, которая не задевается в основном потоке, но существует)

Чего-то я недопонял... Член класса inf_stat будет модифицироваться и считоваться обеими потоками (и главным и спомогательным)? Это вытекает из твоего первого поста:

Цитировать
В основном потоке (ci.h, ci.cpp) с переменной inf_stat выполняются различные операции. Как мне из этого второго потока получить (или присвоить) ей значение?

Если да, то тогда мютексы нужны для синхронизации потоков.


Название: Re: QThread и основной поток
Отправлено: zodiac от Сентябрь 24, 2007, 18:59
Сейчас стал компилировать и вывелась такая ошибка:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is threadWeather(0x809e0e0), parent's thread is QThread(0x80572f0), current thread is threadWeather(0


Название: Re: QThread и основной поток
Отправлено: pastor от Сентябрь 24, 2007, 19:06
Покажи код всего класса threadWeather


Название: Re: QThread и основной поток
Отправлено: zodiac от Сентябрь 24, 2007, 19:22
Код:
class threadWeather : public QThread
{
Q_OBJECT

public:
threadWeather(QObject *parent = 0);
~threadWeather();

private slots:
void run();
void http_weather_state();

private:
//QHttps
QHttp *http_weather;

//Buffers
QBuffer buffer_weather;
};


Название: Re: QThread и основной поток
Отправлено: zodiac от Сентябрь 24, 2007, 19:37
То был h, вот cpp
Код:
threadWeather::threadWeather(QObject *parent) : QThread(parent)
{
}

threadWeather::~threadWeather(){
}

void threadWeather::run()
{
http_weather = new QHttp(this);
connect(http_weather, SIGNAL(stateChanged(int)), this, SLOT(http_weather_state()));

exec();
}

void threadWeather::http_weather_state()
{
if (http_weather->state() == 5)
{
http_weather->closeConnection();
buffer_weather.close();
QMessageBox::information(0, "weather", QString(buffer_weather.buffer()));
}
}


Название: Re: QThread и основной поток
Отправлено: pastor от Сентябрь 24, 2007, 20:05
Убери парент для QHttp.

Цитировать
This implies, among other things, that you should never pass the QThread object (this) as the parent of an object created in the thread (since the QThread object itself was created in another thread).