======= Threading ======
===== Documentation ======
* http://qt-project.org/doc/qt-5/thread-basics.html
* http://qt-project.org/doc/qt-5/threads-technologies.html
===== ThreadPool ======
각 Qt 어플리케이션은 글로벌하게 스레드 풀을 가지고 있다. 이를 이용해 재사용 가능한 스레드를 생성할 수 있다. 일례로 GUI 어플리케이션에서 어떤 일을 수행하면서도 다른 GUI 파트의 응답을 받을 수 있도록 해야 한다. 그렇게 하려면 어떤 일을 수행하는 코드는 반드시 스레드로 만들어야 응답성이 향상된다.
===== 간단한 예제 =====
[[.:SignalsAndSlots]]에서 설명한 소스에 간단한 글로벌 스레드 풀에 ''Runnable'' 클래스를 동작시키는 예제를 작성하자.
signal_emitter에 다음과 같이 소스를 추가한다.
#include
#include
class ATask : public QRunnable
{
void run()
{
for(int i = 0; i < 10; ++i) {
std::cout << "counting in thread: " << i << '\n';
QThread::sleep(1);
}
}
};
launch() 함수는 다음과 같이 변경한다.
void signal_emitter::launch()
{
std::cout << "Hello, world!\n";
ATask *atask = new ATask();
QThreadPool::globalInstance()->start(atask);
//QThreadPool::globalInstance()->waitForDone();
for(int i = 0; i < 10 ; ++i) {
emit send(i);
QThread::sleep(1);
}
emit finished();
}
이를 실행하면 다음과 같이 race가 발생한다.
Hello, world!
received: 0
counting in thread: 0
received: 1
counting in thread: 1
received: 2
counting in thread: 2
rceocuenitviendg: in thread: 3
3
received: 4
counting in thread: 4
received: 5
counting in thread: 5
received: 6
counting in thread: 6
croeucnetiivnegd :i n thread: 7
7
croeucnetiivnegd :i n thread: 8
8
received: 9
counting in thread: 9
주석을 해제하면
Hello, world!
counting in thread: 0
counting in thread: 1
counting in thread: 2
counting in thread: 3
counting in thread: 4
counting in thread: 5
counting in thread: 6
counting in thread: 7
counting in thread: 8
counting in thread: 9
received: 0
received: 1
received: 2
received: 3
received: 4
received: 5
received: 6
received: 7
received: 8
received: 9
이 소스는 {{:qt:signal_slots_3.tar.gz|여기}}서 다운로드 받을 수 있다.