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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Потоки  (Прочитано 7033 раз)
bigory
Гость
« : Октябрь 23, 2010, 13:56 »

Всем доброе время суток.
Я создал диалоговое окно, в него поместил только один элемент Label. Мне нужно получить нужную мне информацию и передать ее в Label. Вопрос состоит в том, как из потока класса MyThread передать значение в Label, которая находиться в классе Dialog?

Вот код заголовочного файла:
Код:
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QThread>

namespace Ui {
    class Dialog;
    class MyThread;
}

class MyThread : public QThread
{
    Q_OBJECT

protected:
    void run();

public:
    explicit MyThread(QWidget *parent = 0);
    QString get();

private:
    Ui::Dialog *ui;
};

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

Вот код Основного файла:

Код:
#include "dialog.h"
#include "ui_dialog.h"
#include <QtNetwork>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

}

void MyThread::run()
{
    ui->setupUi(Dialog);
    QString str = get();
    if(str=="")ui->label->setText("Не определено");
    else ui->label->setText(str);
}


    QString MyThread::get()
    {
            QString strIP = "Передалось";
            return strIP;
    }

Dialog::~Dialog()
{
    delete ui;
}
Записан
merke
Гость
« Ответ #1 : Октябрь 23, 2010, 14:41 »

Используй технологию сигналов слотов!
Т.е. в потоке делай например emit messaga("HI");

А когда в диалоге создаешь объект потока, соединяй сигнал messaga потока со слотом в классе диалога например,
Код:
connect(mythread, SIGNAL(messaga()), this, SLOT(setMessageToLabel())); 

И все теперь поток и диалог связаны посредством сигналов и слотов, как только в потоке испускается сигнал messaga в параметре несущий твое сообщение, оно будет передано в слот setMessageToLabel()

В слоте реализуй вывод сообщения в лэйбл.
Записан
merke
Гость
« Ответ #2 : Октябрь 23, 2010, 14:44 »

То какой ты показал код это ужас на улице вязов! Смеющийся

Почитай книжки по Qt.  Подмигивающий
Записан
bigory
Гость
« Ответ #3 : Октябрь 23, 2010, 15:00 »

Извините, но я вообще ничего не понял...Грустный
Значит ситуация такая, это диалоговое окно я вызываю через основное окно. Мне нужно создать поток только потому, что в диалоговом окне есть функция get(), которая требует некоторое время для выполнения (В примере я заменил на простенькие операции чтоб не заморачиваться этим голову). Если ее запускать без потока, то приходится ждать появление окна, а так появиться окно с просьбой подождать.

Если там действительно надо использовать сигнал слотов, то хотелось бы по подробнее
Записан
merke
Гость
« Ответ #4 : Октябрь 23, 2010, 15:17 »

О ужас как все сложно вы реализовали. Подумайте, есть более рациональное и простое решение данной задачи!
Записан
bigory
Гость
« Ответ #5 : Октябрь 23, 2010, 15:29 »

Похоже без моей заготовки я не смогу решить проблему
Вот мой исходник http://file.qip.ru/file/d77nvSAd/Admin.html ( 4.58 Kb )
Если в диалоговом окне стереть все что связано с потоком и стереть /* и */, то все заработает как надо, но тогда будет долго появляться окно. Там же та проблема, которую я пытаюсь решить в другом топике (про таблицу), мне нужно разместить таблицу на начало координат, а не на 9х9.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Октябрь 23, 2010, 15:51 »

потоки тут не нужны. Используй сигналы от QNetworkAccessManager, это позволит строить асинхронный интерфейс (в Qt так принято). Более того, станет возможным добавить какую-нибудь кнпоку типа "Cancel", а при синхронном выполнении это будет нереально.
Записан
bigory
Гость
« Ответ #7 : Октябрь 23, 2010, 16:45 »

Из-за ожидания отклика сигнала не будет тормозить появление окна?
Функция get() очень долго выполняется. Я хочу чтобы диалоговое окно появилось сразу, а уже как выполниться get(), появиться нужная информация.
Не будет ли задерживаться появление окна из-за ожидания сигнала?
Записан
bigory
Гость
« Ответ #8 : Октябрь 23, 2010, 17:09 »

Просматривал статьи по QNetworkAccessManager, везде говориться как работать с интернетом, но мне этого не нужно. Не могу понять как это можно связать с моей программой
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Октябрь 23, 2010, 18:28 »

Из-за ожидания отклика сигнала не будет тормозить появление окна?

Ещё раз - get() у тебя синхронный. Это нужно переделать на асинхронность. Сигнал finished() у QNetworkReply (я сперва написал неправильно) соединяй со слотом в самом диалоге, и в этом слоте отрабатывай дальше что нужно. В Qt принято делать асинхронные интерфейсы на основе сигналов-слотов (если это возможно в данном конкретном случае). Что-то типа

Код
C++ (Qt)
Dialog::Dialog(QWidget *p) : QDialog(p)
{
   nm = new QNetworkAccessManager(this);
   reply = nm->get(...);
   connect(reply, SIGNAL(finished()), this, SLOT(slotFinished()));
}
 
void Dialog::slotFinished()
{
   // обработка ошибок и дальнейшие действия
}
 
« Последнее редактирование: Октябрь 23, 2010, 18:33 от Alex Custov » Записан
bigory
Гость
« Ответ #10 : Октябрь 23, 2010, 20:19 »

Слишком все сложно. Я не могу данные передать в Label

Код:
#include "dialog.h"
#include "ui_dialog.h"
#include <QtNetwork>

QString strIP;

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    //______________________Определяем внешний IP через Инет________________________________________________
    nm = new QNetworkAccessManager(this);
    reply = nm->get( QNetworkRequest( QUrl( "http://www.grio.ru/myip.php" ) ) );
    connect(reply, SIGNAL(finished()), this, SLOT(slotFinished()));

}

void Dialog::slotFinished()
{
    ui->setupUi(this);

    QEventLoop loop;
    QObject::connect( reply, SIGNAL( finished() ), &loop, SLOT( quit() ) );
    loop.exec();

    // Проверяем состояние ответа
    if( reply->error() != QNetworkReply::NoError )
            strIP=""; // Ошибка - возвращаем пустую строку

    // Читаем полученные данные в data
    QByteArray data = reply->readAll();

    // Разбираем полученные данные, находим свой ip и возвращаем его
    strIP = QString(data);

    if(strIP=="")ui->label->setText(QObject::tr("Не определено"));
    else ui->label->setText(strIP);
}


    //___________________________Конец определения внешннего IP________________________________________________
Dialog::~Dialog()
{
    delete ui;
}
« Последнее редактирование: Октябрь 23, 2010, 20:23 от bigory » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Ноябрь 06, 2010, 18:53 »

Слишком все сложно. Я не могу данные передать в Label
...

В этом коде какая-то каша, изучай Qt. Ты дважды вызываешь ui->setupUi(this); - зачем? У тебя локалый event loop - зачем? strIP=""; - делфизм, или билдеризм, уж не знаю. strIP=="" - аналогично.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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