Асинхронный запуск в Qt

Иногда необходимо выполнить достаточно длительный код в отдельном потоке, что бы не терять отзывчивость интерфейса в программе.

Обычно для этих целей используют два подхода:

  • наследование от QThread;
  • подход создания объекта рабочего и помещение его в отдельный поток.

Оба они приведены в документации к QThread, изначально второй подход был описан в How To Really, Truly Use QThreads; The Full Explanation.

Это конечно все здорово, но хочется простые вещи делать просто и с наименьшем количеством кода. И тут нам может помочь асинхронный запуск.

Асинхронный запуск в Qt представлен функцией QtConcurrent::run которая входит в состав API высокого уровня многопоточного программирования QtConcurent.  QtConcurrent::run достаточно хорошо описано, я лишь хочу продемонстрировать связку QtConcurrent::run, QFutureWatcherQEventLoop для создания последовательного когда не блокирующего UI

#include <QtCore/QThread>
#include <QtCore/QEventLoop>
#include <QtCore/QFutureWatcher>

#include <QtConcurrent/QtConcurrentRun>

#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QProgressDialog>

class Foo
{
public:
    int bar ()
    {
        QThread::sleep(10);
        return 5;
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Foo foo;
    QFutureWatcher<int> watcher;
    QEventLoop loop;
    QProgressDialog progress;
    progress.setRange(0,0);
    progress.setCancelButton(0);
    progress.show();

    QObject::connect(&watcher,	&QFutureWatcher<int>::finished,
                     &loop, &QEventLoop::quit);

    watcher.setFuture (QtConcurrent::run(&foo, &Foo::bar));

    loop.exec ();
    progress.close ();

    QLabel lbl;
    lbl.setText(QString("Result: %1").arg (watcher.result()));
    lbl.show();

    return a.exec();
}
Реклама

Продолжение экспериментов с программирование под Andoid

Изменения внесенные перед отпуском:

  • Главное меню;
  • Страница отсчета времени тренировки;
  • Дополнительное меню, для переключения между страницами;
  • Фоновое изображение

Скриншоты:

menu

time

stopwatch

А так же демонстрация на живом устройстве HUAWEI U8825 на rutube

Параллельный алгоримт Брона — Кербоша на Erlang

Предисловие

На четвертом курсе, по предмету сети мне выдали курсовую работу по разработке вычислительного грида, решающий какую либо ресурсоемкая  задачу. Задачу выбрал перемножение больших матриц и реализацию делал в распределенной ОС Inferno программируя на shell, т. к. Limbo (один из прародителей Go) не очень пришелся по душе, и был ограничен в свободном времени, т. к. совмещал учебу с работой.

Квалификационная работа бакалавра

Прочитав различные статьи по технологии грид, захотелось поэкспериментировать с диспетчеризацией процессов, а так же использовать что-то более интересное чем shell. И тут наткнулся на Erlang.

На мой взгляд Erlang хорошо подходил для конкретной задаче по следующим критериям:

  • параллельность- это свойство языка, Erlang распределенный язык;
  • функциональная парадигма, хорошо подходит, для реализации формальных алгоритмов.

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

Исходники записки в LaTeX куда то пропали, а остался код(распределенная и параллельная версия программы) и отчет использование ресурсов Intel Manycore Testing Lab, где тестировалась параллельная версия программы.