각 Qt 어플리케이션은 글로벌하게 스레드 풀을 가지고 있다. 이를 이용해 재사용 가능한 스레드를 생성할 수 있다. 일례로 GUI 어플리케이션에서 어떤 일을 수행하면서도 다른 GUI 파트의 응답을 받을 수 있도록 해야 한다. 그렇게 하려면 어떤 일을 수행하는 코드는 반드시 스레드로 만들어야 응답성이 향상된다.
SignalsAndSlots에서 설명한 소스에 간단한 글로벌 스레드 풀에 Runnable
클래스를 동작시키는 예제를 작성하자.
signal_emitter에 다음과 같이 소스를 추가한다.
#include <QThreadPool> #include <QRunnable> 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
이 소스는 여기서 다운로드 받을 수 있다.