Qt에서 QThread와 QFuture의 차이는 뭔가요? (코드첨부)
글쓴이: pogusm / 작성시간: 수, 2011/06/01 - 1:30오후
Background.h
#ifndef BACKGROUND_H #define BACKGROUND_H #include <QThread> #include <QObject> #include <QDebug> class Background : public QThread { Q_OBJECT public: Background(QObject* parent = 0):QThread(parent){} protected: void run() { double cardSoldier = 0; for ( int heart = 1 ; heart < 20000 ; heart ++ ) { for ( int spade = 1 ; spade < 20000 ; spade ++ ) { cardSoldier = cardSoldier + ( double(heart) / double(spade) ); } } qDebug() << (QString("Child function ran in thread: ")) << QThread::currentThreadId(); } }; class BackgroundConcurrent : public QObject { Q_OBJECT public: BackgroundConcurrent(QObject* parent = 0):QObject(parent){} public slots: void doWork() const { double cardSoldier = 0; for ( int heart = 1 ; heart < 20000 ; heart ++ ) { for ( int spade = 1 ; spade < 20000 ; spade ++ ) { cardSoldier = cardSoldier + ( double(heart) / double(spade) ); } } qDebug() << (QString("Concurrent child function ran in thread: ")) << QThread::currentThreadId(); } }; class BackgroundTrigger : public QObject { Q_OBJECT public: BackgroundTrigger(QObject* parent = 0):QObject(parent){} ~BackgroundTrigger() { foreach(QObject* child, children()) { QThread* childThread = qobject_cast<QThread*>(child); if (childThread) childThread->wait(); } } public slots: void triggerWorker() { Background* child = new Background(this); child->start(); } }; #endif // BACKGROUND_H
main.cpp
#include "Background.h" #include <QtCore/QCoreApplication> #include <QtConcurrentRun> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Using QThread BackgroundTrigger childTrigger; qDebug() << (QString("Main function ran in thread: ")) << QThread::currentThreadId(); // Call child childTrigger.triggerWorker(); childTrigger.triggerWorker(); // Using QtConcurrent BackgroundConcurrent cchild; QFuture<void> future1 = QtConcurrent::run(&cchild, &BackgroundConcurrent::doWork); QFuture<void> future2 = QtConcurrent::run(&cchild, &BackgroundConcurrent::doWork); return a.exec(); }
QThread와 QFuture의 차이는 뭔가요?
어떨땐 QThread를 쓰고 어떨땐 QFuture를 써야하는건가요?
Forums:
동기화 할 수 있느냐 없느냐 차이가 아닐까
동기화 할 수 있느냐 없느냐 차이가 아닐까 싶은데요.
저도 정확히는 모르겠군요.
------------------------------
How many legs does a dog have?
궁금해서 찾아보니..
둘을 비교'대상으로 둬야 할지는 잘 모르겠습니다. ㅡ_ㅡ;;
QFuture는 템플릿 클래스'입니다.
처리될 함수?나 클래스의 동기적인 연산결과의 업데이트에 적합하다고 합니다.
시그널 이벤트로 결과를 업데이트 하거나 결과완료. 등에 통지'가 편리합니다.
Qt 포럼에 보니. 쓰레드 매니저를 별도로 만들지 않아도 하던데요.
아마도. QFuture는 그냥 이벤트로 처리된 결과를 받는 용도로 사용하나봅니다.
QThread는 그냥 쓰레드죠.
여기에 시그널 이벤트를 추가해주면 QFuture와 같은 기능을 할것으로 보입니다.
QFuture : Represents the result of an asynchronous computation
QFutureSynchronizer : Convenience class that simplifies QFuture synchronization
QFutureWatcher : Allows monitoring a QFuture using signals and slots
QThread : Platform-independent threads
Qt : simple example of use of QtConcurrent
http://codejourneys.blogspot.com/2008/06/qt-simple-example-of-use-of.html
Enhancing your Qt Application with Multiple Threads :
http://developer.qt.nokia.com/elearning/watch/enhancing_your_qt_application_with_multiple_threads
쓰레드 설명 : http://doc.trolltech.com/4.7/thread.html
쓰레드 : http://doc.trolltech.com/main-snapshot/threads.html
쓰레드 이벤트 설명 : http://developer.qt.nokia.com/wiki/Threads_Events_QObjects
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변 감사합니다.
QThread와 QFuture는 비교 대상이 아니었군요 ㅠㅠ
QFuture, QFutureWatcher 등을 이용해서 시그널을 처리하고 그러는거군요...
그럼 QThread와 QtConcurrent는 비교되상이 되나요?
ㅠㅠ
오래 된 글이지만...
오래 된 글이지만 지나치기엔 아쉬움이 있어서 자바를 경험으로 답변을 드립니다.
Thread와 Future는 둘 다 스레드를 생성하여 실행되는것은 같습니다.
예를 들기 위한 상황을 둔다면 동시 10개의 스레드에서 작업을 한 후 결과 값을 정수나 문자열, 아니면 특정 클래스의 객체를 받는다고 가정합니다.
Thraed일 경우 10개의 스레드에서 결과를 받기 위해서는... 획일화 된 방법 없이 상황에 따라 프로그래머가 결과를 받기 위한 수단을 만들어야 합니다. 때에따라 동기화를 위해 synchronize를 활용해야합니다.
Future같은 경우 단순히 스레드 진입 함수에서 값을 return하기만 하고, Future를 실행 한 함수에서는 10개의 future객체에서 단순히 get하기만 하면 됩니다. (Qt에서는 result 함수인 듯 하네요.)
용도에 따라 선택 하시면 되는데 Future는 스레드가 끝났을 때의 결과값을 받기 편리하도록 되어 있습니다.
추가적으로...
Qt의 문서를 보니 QFuture는 닷넷에서의 BackgroundWorker와 비슷하게 QFutureWatcher를 통하여 백그라운드 진행 상황(%)이나 상황 메시지를 signal로 알려줄 수 있는 인터페이스를 활용할 수 있는 것으로 보입니다.
어싱크로라고 적혀있음에도...
큐퓨처가 어싱크로(비동기식)이라고 적혀도 있음에도 동기라고 해석하는 분이 있군요. 전혀 아닙니다.
가장 큰 차이는 여러오버헤드를 붙여서 쓰레드 풀에 얹어서 쓰느냐 아니면 그냥 바로 쓰레드를 동작시켜서 쓰냐의 차이입니다.
컨커런트의 런을 통하게 되면 일단 템플릿을 거쳐서 가고 글로벌 쓰레드 풀에 접근하여 트라이스타트를 시행합니다. 컨커런트 런은 큐쓰레드를 상속받아 만든 클래스를
실행하고 앞의 과정에 따라붙는 오버헤드가 큽니다. 따라서 상황에 따라 약간의 성능 저하가 있을 수 있습니다.
반대로 큐쓰레드는 말 그대로 쓰레드라서 스타트시 오버헤드가 크지 않습니다. 간단하고 이벤트 루프를 활용하는 코딩에 적합합니다.
상황에 따라 편의에 따라 사용하는 것이 맞습니다. 소켓같은 것을 처리하기에 적합하다고 생각하면 될거 같습니다.
댓글 달기