crossplatform.ru

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


  Ответ в Выполнение произвольной фунции в отдельном потоке
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Fandorin Дата 19.4.2010, 20:32
  QList<QVariant> и его уже передавать :rolleyes: Наш ответ. Теперь параметры - не проблема) Спасибо всем за помощь)
Litkevich Yuriy Дата 19.4.2010, 20:29
 
Цитата(Fandorin @ 19.4.2010, 23:51) *
Если убрать f1.waitForFinished() GUI отвечает.
ну это по моему очевидно, ты остался сидеть в некой функции (в твоём случае MainWindow::startThread), которая выполняется в основном потоке, и ждать завершения доппотока
ViGOur Дата 19.4.2010, 20:19
 
Цитата(Fandorin @ 19.4.2010, 20:51) *
Однако остается открытый вопрос - что если число параметров равно 6 или более?
В таком случае думаю правильней будет создать класс произвольный от QThread и работать уже с ним...

Или как вариант создать структуры, а в ней уже твои параметры. И передавать уже объект структуры.
Fandorin Дата 19.4.2010, 19:51
  Да, спасибо, я видел этот пример. Но допустим мне пока не нужно диалог прогресса. Мне нужно, чтобы просто отвечал интерфейс при выполнении долгого вычисления. Если убрать f1.waitForFinished() GUI отвечает. Однако остается открытый вопрос - что если число параметров равно 6 или более?
ViGOur Дата 19.4.2010, 19:47
  А попробуй данный пример:
"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:25
  Прочитал я дисскусию и понял, что дискуссию забросили. Так может быть кто нибудь поделится универсальным методом запуска отдельного потока без зависания 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;
    }
}

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

это чо такое?

Idle - время простоя. В винде в приложение даже специальное сообщение в окно приходит.
Ну а в Qt можно таймером с 0-вым интервалом обойтись. :)
Litkevich Yuriy Дата 29.10.2008, 14:24
  очепятался немного
idle - простой/ничего не деланье
kuler Дата 29.10.2008, 14:07
 
Цитата(Litkevich Yuriy @ 29.10.2008, 13:56) *
idl

a это? :blink:
Litkevich Yuriy Дата 29.10.2008, 13:56
 
Цитата(kuler @ 29.10.2008, 16:02) *
это чо такое?
idl
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 14:07