한국어
Qt


Qt에서 쓰레드를 생성하는 방법은 몇가지가 있는데 여기서는 QtConcurrent를 이용한 벙법을 소개한다.

예제소스이다

 #include <QCoreApplication>
#include <qtconcurrentrun.h>
#include <QThread>

#ifndef QT_NO_CONCURRENT

void myRunFunction(QString name)
{
    for(int i = 0; i <= 5; i++)
    {
        qDebug() << name << " " << i <<
                    "from" << QThread::currentThread();
    }
}

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

    QFuture<void> t1 = QtConcurrent::run(myRunFunction, QString("A"));
    QFuture<void> t2 = QtConcurrent::run(myRunFunction, QString("B"));
    QFuture<void> t3 = QtConcurrent::run(myRunFunction, QString("C"));

    t1.waitForFinished();
    t2.waitForFinished();
    t3.waitForFinished();

    return a.exec();
}

#else

#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QString text("Qt Concurrent is not yet supported on this platform");

    QLabel *label = new QLabel(text);
    label->setWordWrap(true);

    label->show();
    qDebug() << text;

    app.exec();
}
#endif

.pro파일에는 아래와 같은 행을 추가 해야한다.

 QT       += concurrent

예제에서 볼 수 있듯이 Worker쓰레드를 만들거나 Qthread를 생성할 필요없이 단지 할 일은 적절한 매개변수 전달과 실행될 함수를 정의하는 것이다. 예제에서 QtConcurrent의 아래와 같은 API들을 사용했다.


QtConcurrent::run() - 다른 쓰레드에서 함수를 실행한다.

QFuture - 비동기의 결과를 제어하는 클래스이다.

QFuture는 실제로 waitForFinished()<결과를 기다리거나>, result()<결과 값을 확인하거나>, cancel(), pause(), or resume()등의 메소드들을 제공한다.


그러면 MapReduce는 무엇인가.

MapReduce는 구글에서 대용량 인터넷 데이터를 처리하기 위해 고안했으며, 분산파일시스템에서 데이터의 병렬처리를 가능하게 한다.

QtConcurrent은 이러한 병렬 목록 처리를 위한 방법들을 제공하는 것이다.


QtConcurrent 및 MapReduce의 좀더 자세한 내용은 해당사이트를 참고하기 바란다.

http://doc.qt.io/qt-5/qtconcurrent-index.html