crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3  
Ответить в данную темуНачать новую тему
> Выполнение произвольной фунции в отдельном потоке
kuler
  опции профиля:
сообщение 29.10.2008, 14:07
Сообщение #21


Танцор диско
***

Группа: Участник
Сообщений: 441
Регистрация: 11.9.2008
Из: Москва
Пользователь №: 289

Спасибо сказали: 6 раз(а)




Репутация:   -1  


Цитата(Litkevich Yuriy @ 29.10.2008, 13:56) *
idl

a это? :blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.10.2008, 14:24
Сообщение #22


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


очепятался немного
idle - простой/ничего не деланье
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 1.11.2008, 13:56
Сообщение #23


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Цитата(kuler @ 29.10.2008, 16:02) *
Цитата(Tonal @ 29.10.2008, 11:33) *
или в идле.

это чо такое?

Idle - время простоя. В винде в приложение даже специальное сообщение в окно приходит.
Ну а в Qt можно таймером с 0-вым интервалом обойтись. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Fandorin
  опции профиля:
сообщение 19.4.2010, 19:25
Сообщение #24


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 19.4.2010
Пользователь №: 1642

Спасибо сказали: 0 раз(а)




Репутация:   0  


Прочитал я дисскусию и понял, что дискуссию забросили. Так может быть кто нибудь поделится универсальным методом запуска отдельного потока без зависания GUI. В QT 4.6.2 есть класс Qt::Concurrent, который позволяет запускать произвольную функцию в отдельном потоке. Однако тут есть проблема - число аргументов функции не может быть больше 5. Вот кусок кода, после которого GUI виснет наглухо.
Раскрывающийся текст

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    connect(this->ui->button1, SIGNAL(clicked()), this, SLOT(startThread()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void MainWindow::startThread()
{
    QFuture<void> f1 = QtConcurrent::run(mbox);
    f1.waitForFinished();
}

void mbox()
{
    for (int i=0; i < 100000; i++)
    {
        qDebug() << i;
    }
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 19.4.2010, 19:47
Сообщение #25


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


А попробуй данный пример:
"QtConcurrent Progress Dialog Example"
#include <QtGui>

#ifndef QT_NO_CONCURRENT

using namespace QtConcurrent;

const int iterations = 20;

void spin(int &iteration)
{
     const int work = 1000 * 1000 * 40;
     volatile int v = 0;
     for (int j = 0; j < work; ++j)
         ++v;

     qDebug() << "iteration" << iteration << "in thread" << QThread::currentThreadId();
}

int main(int argc, char **argv)
{
     QApplication app(argc, argv);

     // Подготавливаем вектор.
     QVector<int> vector;
     for (int i = 0; i < iterations; ++i)
         vector.append(i);

     // Создаём диалог индикатора выполнения.
     QProgressDialog dialog;
     dialog.setLabelText(QString("Progressing using %1 thread(s)...").arg(QThread::idealThreadCount()));

     // Создаём QFutureWatcher и соединяем сигналы и слоты.
     QFutureWatcher<void> futureWatcher;
     QObject::connect(&futureWatcher, SIGNAL(finished()), &dialog, SLOT(reset()));
     QObject::connect(&dialog, SIGNAL(canceled()), &futureWatcher, SLOT(cancel()));
     QObject::connect(&futureWatcher, SIGNAL(progressRangeChanged(int, int)), &dialog, SLOT(setRange(int, int)));
     QObject::connect(&futureWatcher, SIGNAL(progressValueChanged(int)), &dialog, SLOT(setValue(int)));

     // Запускаем вычисление.
     futureWatcher.setFuture(QtConcurrent::map(vector, spin));

     // Отображем диалог и запускаем цикл сообщений.
     dialog.exec();

     futureWatcher.waitForFinished();

     // Запрашиваем future проверить был ли он отменён.
     qDebug() << "Canceled?" << futureWatcher.future().isCanceled();
}

#else

int main()
{
         qDebug() << "Qt Concurrent is not yet supported on this platform";
}

#endif
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Fandorin
  опции профиля:
сообщение 19.4.2010, 19:51
Сообщение #26


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 19.4.2010
Пользователь №: 1642

Спасибо сказали: 0 раз(а)




Репутация:   0  


Да, спасибо, я видел этот пример. Но допустим мне пока не нужно диалог прогресса. Мне нужно, чтобы просто отвечал интерфейс при выполнении долгого вычисления. Если убрать f1.waitForFinished() GUI отвечает. Однако остается открытый вопрос - что если число параметров равно 6 или более?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 19.4.2010, 20:19
Сообщение #27


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Fandorin @ 19.4.2010, 20:51) *
Однако остается открытый вопрос - что если число параметров равно 6 или более?
В таком случае думаю правильней будет создать класс произвольный от QThread и работать уже с ним...

Или как вариант создать структуры, а в ней уже твои параметры. И передавать уже объект структуры.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 19.4.2010, 20:29
Сообщение #28


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Fandorin @ 19.4.2010, 23:51) *
Если убрать f1.waitForFinished() GUI отвечает.
ну это по моему очевидно, ты остался сидеть в некой функции (в твоём случае MainWindow::startThread), которая выполняется в основном потоке, и ждать завершения доппотока
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Fandorin
  опции профиля:
сообщение 19.4.2010, 20:32
Сообщение #29


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 19.4.2010
Пользователь №: 1642

Спасибо сказали: 0 раз(а)




Репутация:   0  


QList<QVariant> и его уже передавать :rolleyes: Наш ответ. Теперь параметры - не проблема) Спасибо всем за помощь)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 9:28