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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QThread и основной поток  (Прочитано 8161 раз)
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
Записан
WW
Гость
« Ответ #1 : Сентябрь 24, 2007, 17:13 »

CIForm *frm;
... инициализация
frm->inf_stat
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Сентябрь 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>
    ...
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
zodiac
Гость
« Ответ #3 : Сентябрь 24, 2007, 18:19 »

threads.cpp: In member function ‘virtual void threadWeather::run()’:
threads.cpp:12: ошибка: нет декларации ‘CIForm’ в этой области видимости
threads.cpp:12: ошибка: нет декларации ‘frm_ci’ в этой области видимости
Записан
zodiac
Гость
« Ответ #4 : Сентябрь 24, 2007, 18:21 »

ИМХО Mutex мне не нужен, т.к.второстепенный поток будет делать свою функцию и не задевать остальное. (Ну т.е. задевать только 1 переменную, которая не задевается в основном потоке, но существует)
Насчет QMessageBox это я для тестирования.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Сентябрь 24, 2007, 18:30 »

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

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

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

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
zodiac
Гость
« Ответ #6 : Сентябрь 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
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Сентябрь 24, 2007, 19:06 »

Покажи код всего класса threadWeather
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
zodiac
Гость
« Ответ #8 : Сентябрь 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;
};
Записан
zodiac
Гость
« Ответ #9 : Сентябрь 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()));
}
}
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Сентябрь 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).
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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