Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt5]Qthread и асинхронный запрос, Нужен совет 
:(
    Опции темы
dix75
Дата 15.4.2014, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: 1
Всего: 1



vinter, 
Были сипользованы все предложенный Qt способы (до написания просьбы помочь).
И еще раз повторю он не работает с асинхронными запросами.

Это сообщение отредактировал(а) dix75 - 15.4.2014, 16:34


--------------------
save your mind
PM MAIL   Вверх
vinter
Дата 15.4.2014, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



dix75, значит ты, что-то делаешь не так. Уу меня QNetworkManager работает нормально. 
Собирай минимальный проект и выкладывай тут - посмотрим.


--------------------
Мой блог
PM MAIL WWW   Вверх
dix75
Дата 15.4.2014, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: 1
Всего: 1



vinter, 
У меня QNetworkManager тоже работает.
Не работает он  в потоке.


--------------------
save your mind
PM MAIL   Вверх
vinter
Дата 15.4.2014, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



хорошо, у меня он тоже работает в потоке. Я тебе ещё раз повторяю - ты, что-то делаешь не так. Что? Не знаю, выкладывай проект - посмотрим.


--------------------
Мой блог
PM MAIL WWW   Вверх
dix75
Дата 15.4.2014, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: 1
Всего: 1



Вот набрасал

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  test.zip 1,14 Kb


--------------------
save your mind
PM MAIL   Вверх
vinter
Дата 15.4.2014, 19:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



Код

void run() {
        Worker *worker = new Worker;

        connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
        connect(this, &Controller::operate, worker, &Worker::doWork);
        connect(worker, &Worker::resultReady, this, &Controller::handleResults);
        worker->moveToThread(&workerThread);
        workerThread.start();
        emit operate("something");
        qDebug() << "start";
    }



--------------------
Мой блог
PM MAIL WWW   Вверх
dix75
Дата 17.4.2014, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: 1
Всего: 1



vinter, 
Спасибо работает.
Правда ругается что не может создать дочерний объект, т.к он находится в другом потоке.


Я так понимаю, тоже самое сделать через QtConcurrentyt Не получится?


--------------------
save your mind
PM MAIL   Вверх
vinter
Дата 17.4.2014, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 3
Всего: 56



Цитата(dix75 @  17.4.2014,  19:10 Найти цитируемый пост)
Правда ругается что не может создать дочерний объект, т.к он находится в другом потоке.

если что-то ругается, значит надо исправить. Ругань это скрытая ошибка. 

Цитата(dix75 @  17.4.2014,  19:10 Найти цитируемый пост)
Я так понимаю, тоже самое сделать через QtConcurrentyt Не получится?

В таком виде - нет. QtConcurrent не содержит т.н. continuations, таким образом ты можешь получить QFuture и ждать на ней, но ты не можешь задать действии по срабатыванию future и забыть о ней. Так что либо написать свою обёртку, либо жить с сигналами и слотами. Асинхронность "из-коробки" в Qt весьма слабая. 


Лично я для создания асинхронных интерфейсов в Qt использую следующий метод:
Код

#include <QObject>

class QEvent;
class ActionEvent;

class ActionAwareObject: public QObject
{
public:
    using QObject::QObject;
    bool event(QEvent* event) override;
};

Код

#include "ActionAwareObject.h"
#include "ActionEvent.h"

bool ActionAwareObject::event(QEvent* event)
{
    if(event->type() == ActionEvent::registeredId())
    {
        auto action = dynamic_cast<ActionEvent*>(event);
        Q_ASSERT(action);
        (*action)();
    }
    return QObject::event(event);
}

Код

#include <functional>
#include <QEvent>

class ActionEvent: public QEvent
{
public:
    using Action_t = std::function<void()>;
public:
    ActionEvent(const Action_t& action);
    void operator()();
    static int registeredId();
private:
    std::function<void()> m_Action;
};

Код

#include "ActionEvent.h"

ActionEvent::ActionEvent(const Action_t& action):
    QEvent(static_cast<QEvent::Type>(registeredId())),
    m_Action(action)
{

}

void ActionEvent::operator()()
{
    Q_ASSERT(m_Action);
    m_Action();
}

int ActionEvent::registeredId()
{
    static int id = QEvent::registerEventType();
    return id;
}


и пример использования:

Код

class SomeClass: public ActionAwareObject
{
       void asyncMethod()
      {
           auto action = [=]
           {
               plainMethod();
            };
            QCoreApplication::postEvent(this, new ActionEvent{action});
      }
       void plainMethod()
       {
            ...
       }
};


Если из асинхронного метода надо возвращать значение - используй std::future в связке с std::promise


--------------------
Мой блог
PM MAIL WWW   Вверх
dix75
Дата 18.4.2014, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: 1
Всего: 1



vinter,  Да, спасибо.  Надо выделить время и изучить Qt треды. Жаль что его нет.


--------------------
save your mind
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.