Qt에서 QThread와 QFuture의 차이는 뭔가요? (코드첨부)

pogusm의 이미지

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를 써야하는건가요?

semmal의 이미지

동기화 할 수 있느냐 없느냐 차이가 아닐까 싶은데요.

저도 정확히는 모르겠군요.

------------------------------
How many legs does a dog have?

shint의 이미지

둘을 비교'대상으로 둬야 할지는 잘 모르겠습니다. ㅡ_ㅡ;;

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

pogusm의 이미지

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로 알려줄 수 있는 인터페이스를 활용할 수 있는 것으로 보입니다.

qqq의 이미지

큐퓨처가 어싱크로(비동기식)이라고 적혀도 있음에도 동기라고 해석하는 분이 있군요. 전혀 아닙니다.

가장 큰 차이는 여러오버헤드를 붙여서 쓰레드 풀에 얹어서 쓰느냐 아니면 그냥 바로 쓰레드를 동작시켜서 쓰냐의 차이입니다.

컨커런트의 런을 통하게 되면 일단 템플릿을 거쳐서 가고 글로벌 쓰레드 풀에 접근하여 트라이스타트를 시행합니다. 컨커런트 런은 큐쓰레드를 상속받아 만든 클래스를

실행하고 앞의 과정에 따라붙는 오버헤드가 큽니다. 따라서 상황에 따라 약간의 성능 저하가 있을 수 있습니다.

반대로 큐쓰레드는 말 그대로 쓰레드라서 스타트시 오버헤드가 크지 않습니다. 간단하고 이벤트 루프를 활용하는 코딩에 적합합니다.

상황에 따라 편의에 따라 사용하는 것이 맞습니다. 소켓같은 것을 처리하기에 적합하다고 생각하면 될거 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.