LINUX.ORG.RU

[qt][c++]опять потоки

 ,


0

1

Вопрос банальный и часто подымаемый, но не нашёл решения ни на ЛОРе, ни в гугл.
Есть формочка,выбираем файл с исходными данными, вбиваем нек-ые дополнительные параметры, нажимаем кнопочку, которая запускает тяжелую функцию. Чтобы интерфейс не зависал, пробовал в потомок qthread вызов кидать, но в этом случае поток работает после функции, в котором был создан; если использовать wait, то всё зависает; если не использовать сабклассинг, как на сайте советуют, ещё хуже становится - поток работает после закрытия окна.
Собственно интересует верное решение.

★★★★

Последнее исправление: aptyp (всего исправлений: 1)

Не совсем понятно, что тебе нужно. Если нужно закрыть диалог по окончанию завершения, просто соедини сигнал finished потока со слотом своего диалога.

panter_dsd ★★★★
()

Числодробильный поток, в котором есть слот. Сигналом этот слот вызываешь. Если нужно возвращаемое значение - использовать для этого механизмы синхронизации.

unfo ★★★★★
()

Верное решение - слать из потока привет по окончанию обработки главному окну. Привет можно реализовать теми же сигналами/слотами.

А вообще, можно и без потока обойтись - делать тяжелые операции прямо в гуишном потоке, просто время от времени вручную прокручивая ивентлуп.

anonymous
()

Используй QtConcurrent::run()

m0rph ★★★★★
()
Ответ на: комментарий от panter_dsd

По завершению нужно заполнить кое-какие поля и нарисовать график.
Видимо ошибка в том, что я пытаюсь это сделать в той же функции

...
    gather();
    MyThread *mt = new MyThread(some_data);
    mt.start();
    important_data = mt.get_data();
    plot_and_rest();
...
после mt.start() нужно выйти, предварительно законнектив finished cо слотом plot_and_rest, да?

aptyp ★★★★
() автор топика
Ответ на: комментарий от anonymous

Вот первое решение наверное и заюзаю.

ммм, почитаю про него.

aptyp ★★★★
() автор топика
Ответ на: комментарий от unC0Rr

При текущем подходе также не подходят, так как стопорят гуй.
Буду копать в сторону слотов.

aptyp ★★★★
() автор топика
Ответ на: комментарий от shty

Хорошая дока, правда я уже сделал в стиле(попалю код)

void InverseProblemThread::run()
{
        emit doneWork(cga->run());
        return;
}

void MainWindow::calculationEnded(DiffConstsPar dcp)
{
        ui->foundK1Label->setText(QString("%1").arg(dcp.constants[0]));
        ui->foundK2Label->setText(QString("%1").arg(dcp.constants[1]));
        ui->foundK3Label->setText(QString("%1").arg(dcp.constants[2]));
        ui->reachedDifferenceLabel->setText(QString("%1").arg(dcp.difference));
        ui->numOfUsedGenerationsLabel->setText(QString("%1").arg(dcp.generations_counter));
        ui->spentTimeLabel->setText(QString("%1").arg(dcp.time));
        ui->statusbar->showMessage("ended");
}

void MainWindow::on_inverseProblemPushButton_clicked()
{
...
        InverseProblemThread *ipt = new InverseProblemThread(cga);
        qRegisterMetaType<DiffConstsPar>("DiffConstsPar");
        connect(ipt, SIGNAL(doneWork(DiffConstsPar)), this,
                SLOT(calculationEnded(DiffConstsPar)));
        ipt->start();
}

aptyp ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.