이 페이지에서

QThread Class

QThread 클래스는 플랫폼에 구애받지 않는 스레드 관리 방법을 제공합니다. 더 보기...

헤더: #include <QThread>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
상속: QObject

공개 유형

enum Priority { IdlePriority, LowestPriority, LowPriority, NormalPriority, HighPriority, …, InheritPriority }
(since 6.9) enum class QualityOfService { Auto, High, Eco }

공개 함수

QThread(QObject *parent = nullptr)
virtual ~QThread()
QAbstractEventDispatcher *eventDispatcher() const
(since 6.8) bool isCurrentThread() const
bool isFinished() const
bool isInterruptionRequested() const
bool isRunning() const
int loopLevel() const
QThread::Priority priority() const
void requestInterruption()
(since 6.9) QThread::QualityOfService serviceLevel() const
void setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)
void setPriority(QThread::Priority priority)
(since 6.9) void setServiceLevel(QThread::QualityOfService serviceLevel)
void setStackSize(uint stackSize)
uint stackSize() const
bool wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
bool wait(unsigned long time)

재구현된 공용 함수

virtual bool event(QEvent *event) override

공개 슬롯

void exit(int returnCode = 0)
void quit()
void start(QThread::Priority priority = InheritPriority)
void terminate()

신호

void finished()
void started()

정적 공용 멤버

QThread *create(Function &&f, Args &&... args)
QThread *currentThread()
Qt::HANDLE currentThreadId()
int idealThreadCount()
(since 6.8) bool isMainThread()
void msleep(unsigned long msecs)
(since 6.6) void sleep(std::chrono::nanoseconds nsecs)
void sleep(unsigned long secs)
void usleep(unsigned long usecs)
void yieldCurrentThread()

보호된 함수

int exec()
virtual void run()

정적 보호 멤버

void setTerminationEnabled(bool enabled = true)

상세 설명

QThread 객체는 프로그램 내의 하나의 제어 스레드를 관리합니다. QThread는 ` run()`에서 실행을 시작합니다. 기본적으로 ` run()`는 ` exec()`를 호출하여 이벤트 루프를 시작하고, 스레드 내에서 Qt 이벤트 루프를 실행합니다.

QObject::moveToThread()을 사용하여 워커 객체를 해당 스레드로 이동시켜 사용할 수 있습니다.

class Worker : public QObject
{
    Q_OBJECT

public slots:
    void doWork(const QString &parameter) {
        QString result;
        /* ... here is the expensive or blocking operation ... */
        emit resultReady(result);
    }

signals:
    void resultReady(const QString &result);
};

class Controller : public QObject
{
    Q_OBJECT
    QThread workerThread;
public:
    Controller() {
        Worker *worker = new Worker;
        worker->moveToThread(&workerThread);
        connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
        connect(this, &Controller::operate, worker, &Worker::doWork);
        connect(worker, &Worker::resultReady, this, &Controller::handleResults);
        workerThread.start();
    }
    ~Controller() {
        workerThread.quit();
        workerThread.wait();
    }
public slots:
    void handleResults(const QString &);
signals:
    void operate(const QString &);
};

그러면 Worker의 슬롯 내 코드는 별도의 스레드에서 실행됩니다. 그러나 Worker의 슬롯을 어떤 스레드의 어떤 객체에서 나오는 어떤 신호에든 자유롭게 연결할 수 있습니다. queued connections 라는 메커니즘 덕분에 서로 다른 스레드 간에 신호와 슬롯을 연결해도 안전합니다.

코드를 별도의 스레드에서 실행하는 또 다른 방법은 QThread를 상속받아 run()를 재구현하는 것입니다. 예를 들면 다음과 같습니다:

class WorkerThread : public QThread
{
    Q_OBJECT
public:
    explicit WorkerThread(QObject *parent = nullptr) : QThread(parent) { }
protected:
    void run() override {
        QString result;
        /* ... here is the expensive or blocking operation ... */
        emit resultReady(result);
    }
signals:
    void resultReady(const QString &s);
};

void MyObject::startWorkInAThread()
{
    WorkerThread *workerThread = new WorkerThread(this);
    connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
    connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
    workerThread->start();
}

이 예제에서 스레드는 run 함수가 반환된 후 종료됩니다. exec()를 호출하지 않는 한, 해당 스레드에서는 이벤트 루프가 실행되지 않습니다.

QThread 인스턴스는 run()를 호출하는 새 스레드가 아닌, 이를 인스턴스화한 기존 스레드에서 lives in 를 호출한다는 점을 기억하는 것이 중요합니다. 즉, QThread의 큐에 등록된 모든 슬롯과 invoked methods 는 기존 스레드에서 실행됩니다. 따라서 새 스레드에서 슬롯을 호출하고자 하는 개발자는 워커 객체 방식을 사용해야 하며, 하위 클래스로 확장된 QThread에 새로운 슬롯을 직접 구현해서는 안 됩니다.

큐에 등록된 슬롯이나 호출된 메서드와 달리, QThread 객체에서 직접 호출되는 메서드는 해당 메서드를 호출한 스레드에서 실행됩니다. QThread를 서브클래스화할 때는 생성자가 기존 스레드에서 실행되는 반면, run()는 새로운 스레드에서 실행된다는 점을 유의해야 합니다. 두 함수 모두에서 멤버 변수에 접근하는 경우, 해당 변수는 서로 다른 두 스레드에서 접근되는 것입니다. 이렇게 하는 것이 안전한지 확인하십시오.

참고: 서로 다른 스레드에 걸쳐 객체와 상호작용할 때는주의가 필요합니다. 일반적인 규칙으로, 문서에 달리 명시되지 않는 한 함수는 QThread 객체 자체를 생성한 스레드(예: setPriority())에서만 호출할 수 있습니다. 자세한 내용은 ‘스레드 동기화’를 참조하십시오.

스레드 관리

QThread는 스레드가 started() 및 finished() 상태일 때 신호를 통해 알림을 보내며, isFinished() 및 isRunning()를 사용하여 스레드의 상태를 조회할 수도 있습니다.

exit() 또는 quit()을 호출하여 스레드를 중지할 수 있습니다. 극단적인 경우, 실행 중인 스레드에 대해 terminate()을 강제로 호출하고 싶을 수도 있습니다. 그러나 이는 위험하므로 권장하지 않습니다. 자세한 내용은 terminate() 및 setTerminationEnabled()에 대한 문서를 참조하십시오.

스레드가 종료될 때 해당 스레드 내에 존재하는 객체의 할당을 해제하고 싶은 경우가 종종 있습니다. 이를 위해 finished() 신호를 QObject::deleteLater()에 연결하십시오.

wait()을 사용하면 다른 스레드의 실행이 완료될 때까지(또는 지정된 시간이 경과할 때까지) 호출 스레드를 차단할 수 있습니다.

QThread는 또한 플랫폼에 독립적인 정적 sleep 함수인 sleep(), msleep(), usleep()을 제공하며, 이 함수들은 각각 초, 밀리초, 마이크로초 단위의 정밀한 해상도를 지원합니다.

참고: Qt는 이벤트 기반 프레임워크이므로, 일반적으로wait() 및 sleep() 함수는 사용할 필요가 없습니다. wait() 대신 finished() 신호를 수신하는 것을 고려하십시오. sleep() 함수 대신 QChronoTimer 를 사용하는 것을 고려하십시오.

정적 함수 currentThreadId()과 currentThread()은 현재 실행 중인 스레드의 식별자를 반환합니다. 전자는 스레드에 대한 플랫폼별 ID를 반환하고, 후자는 QThread 포인터를 반환합니다.

스레드에 부여될 이름을 지정하려면(예를 들어, 리눅스에서 ps -L 명령어로 식별되는 이름), 스레드를 시작하기 전에 setObjectName()을 호출하면 됩니다. setObjectName()를 호출하지 않으면, 스레드에 부여되는 이름은 스레드 객체의 런타임 유형의 클래스 이름이 됩니다(예를 들어, 만델브로트 예제의 경우 "RenderThread" 가 되는데, 이는 QThread 하위 클래스의 이름이기 때문입니다). 현재 Windows의 릴리스 빌드에서는 이 기능을 사용할 수 없다는 점에 유의하십시오.

Qt의 멀티스레딩( QThreadStorage), 스레드 동기화, 세마포어를 사용한 만델브로트, 프로듀서 및 컨슈머, 그리고 대기 조건을 사용한 프로듀서 및 컨슈머문서를 참조하십시오 .

멤버 유형 문서

enum QThread::Priority

이 열거형 유형은 운영 체제가 새로 생성된 스레드를 어떻게 스케줄링해야 하는지를 나타냅니다.

상수값설명
QThread::IdlePriority0다른 스레드가 실행 중이지 않을 때만 스케줄링됩니다.
QThread::LowestPriority1LowPriority보다 스케줄링 빈도가 낮습니다.
QThread::LowPriority2NormalPriority보다 덜 자주 스케줄링됩니다.
QThread::NormalPriority3운영 체제의 기본 우선순위입니다.
QThread::HighPriority4NormalPriority보다 더 자주 스케줄링됩니다.
QThread::HighestPriority5HighPriority보다 더 자주 스케줄링됩니다.
QThread::TimeCriticalPriority6가능한 한 자주 스케줄링됩니다.
QThread::InheritPriority7생성 스레드와 동일한 우선순위를 사용합니다. 이것이 기본값입니다.

[since 6.9] enum class QThread::QualityOfService

이 열거형은 스레드의 서비스 품질 수준을 설명하며, 스레드가 수행하는 작업의 종류에 대한 정보를 스케줄러에 제공합니다. 서로 다른 CPU 프로파일을 갖거나 CPU의 특정 코어 클럭 속도를 낮출 수 있는 플랫폼에서, 이를 통해 스케줄러는 해당 스레드에 적합한 성능 및 전력 특성을 가진 CPU 코어를 선택하거나 구성할 수 있습니다.

상수값설명
QThread::QualityOfService::Auto0기본값으로, 스레드를 실행할 CPU 코어를 스케줄러가 결정하도록 합니다.
QThread::QualityOfService::High1스케줄러는 이 스레드를 고성능 CPU 코어에서 실행해야 합니다.
QThread::QualityOfService::Eco2스케줄러는 이 스레드를 에너지 효율이 높은 CPU 코어에서 실행해야 합니다.

이 열거형은 Qt 6.9에서 도입되었습니다.

Priority, serviceLevel() 및 QThreadPool::serviceLevel()도 참조하십시오 .

멤버 함수 문서

[explicit] QThread::QThread(QObject *parent = nullptr)

새로운 스레드를 관리하기 위해 새로운 QThread 객체를 생성합니다. parent 는 해당 QThread에 대한 소유권을 갖습니다. start()가 호출될 때까지 스레드는 실행을 시작하지 않습니다.

start()도 참조하십시오 .

[virtual noexcept] QThread::~QThread()

QThread 를 삭제합니다.

QThread 객체를 삭제해도 해당 객체가 관리하는 스레드의 실행은 중단되지 않는다는 점에 유의하십시오. 실행 중인 QThread 를 삭제하면(즉, ` isFinished()`가 ` false`를 반환하는 경우), 프로그램이 중단됩니다. QThread 를 삭제하기 전에 ` finished()` 신호가 발생할 때까지 기다려야 합니다.

Qt 6.3부터는 QThread::create() 호출로 생성된 QThread 인스턴스를, 해당 스레드가 여전히 실행 중이라 하더라도 삭제할 수 있습니다. 이러한 경우, Qt는 해당 스레드에 중단 요청을 전송하고( requestInterruption()를 통해), 스레드의 이벤트 루프(있는 경우)에 종료하도록 요청하며( quit()를 통해), 스레드가 완료될 때까지 차단합니다.

create(), isInterruptionRequested(), exec(), quit()도 참조하십시오 .

[static] template <typename Function, typename... Args> QThread *QThread::create(Function &&f, Args &&... args)

args 인자를 사용하여 f 함수를 실행할 새로운 QThread 객체를 생성합니다.

새 스레드는 즉시 시작되지 않으며, start()을 명시적으로 호출하여 시작해야 합니다. 이를 통해 해당 스레드의 신호에 연결하거나, QObject를 스레드로 이동시키거나, 새 스레드의 우선순위를 설정하는 등의 작업을 수행할 수 있습니다. f 함수는 새 스레드에서 호출됩니다.

새로 생성된 QThread 인스턴스를 반환합니다.

참고: 호출자는 반환된 QThread 인스턴스에 대한 소유권을 획득합니다.

경고: 반환된 QThread 인스턴스에서 start()을 두 번 이상 호출하지마십시오 . 그렇게 할 경우 정의되지 않은 동작이 발생합니다.

start()도 참조하십시오 .

[static] QThread *QThread::currentThread()

현재 실행 중인 스레드를 관리하는 ` QThread `에 대한 포인터를 반환합니다.

[static noexcept] Qt::HANDLE QThread::currentThreadId()

현재 실행 중인 스레드의 스레드 핸들을 반환합니다.

경고: 이 함수가 반환하는핸들은 내부 용도로만 사용되며, 어떠한 응용 프로그램 코드에서도 사용해서는 안 됩니다.

참고: Windows에서 이 함수는 Win32 함수 GetCurrentThread()가 반환하는 의사 핸들(Windows 스레드 핸들)이 아니라, Win32 함수 GetCurrentThreadId()가 반환하는 DWORD(Windows 스레드 ID)를 반환합니다.

[override virtual] bool QThread::event(QEvent *event)

QObject::event(QEvent *e)를 재구현합니다.

QAbstractEventDispatcher *QThread::eventDispatcher() const

해당 스레드의 이벤트 디스패처 객체에 대한 포인터를 반환합니다. 해당 스레드에 이벤트 디스패처가 없는 경우, 이 함수는 ` nullptr`를 반환합니다.

setEventDispatcher()도 참조하십시오 .

[protected] int QThread::exec()

이벤트 루프에 진입하여 exit()이 호출될 때까지 대기하며, exit()에 전달된 값을 반환합니다. exit()이 quit()을 통해 호출된 경우 반환되는 값은 0입니다.

이 함수는 run() 내부에서 호출되도록 설계되었습니다. 이벤트 처리를 시작하려면 이 함수를 호출해야 합니다.

참고: 이 함수는 해당 스레드 내부, 즉 현재 스레드일 때만 호출할 수 있습니다.

quit() 및 exit()도 참조하십시오 .

[slot] void QThread::exit(int returnCode = 0)

스레드의 이벤트 루프가 반환 코드를 가지고 종료되도록 지시합니다.

이 함수를 호출하면 스레드는 이벤트 루프를 종료하고 ` QEventLoop::exec()` 호출에서 반환됩니다. ` QEventLoop::exec()` 함수는 ` returnCode`를 반환합니다.

관례에 따라 returnCode 값이 0이면 성공을 의미하며, 0이 아닌 값은 오류를 나타냅니다.

동명의 C 라이브러리 함수와는 달리, 이 함수는 호출자에게 반환되며 이벤트 처리가 중지된다는 점에 유의하십시오.

QThread::exec()이 다시 호출될 때까지 이 스레드에서는 더 이상 QEventLoop가 시작되지 않습니다. QThread::exec() 내의 이벤트 루프가 실행 중이 아닌 경우, 다음에 QThread::exec()을 호출해도 즉시 반환됩니다.

참고: 이 함수는 스레드 안전합니다.

quit() 및 QEventLoop도 참조하십시오 .

[private signal] void QThread::finished()

이 신호는 관련 스레드가 실행을 완료하기 직전에 발생합니다.

이 신호가 발송될 때, 이벤트 루프는 이미 실행을 중단한 상태입니다. 지연 삭제 이벤트를 제외하고는 해당 스레드에서 더 이상 이벤트가 처리되지 않습니다. 이 신호를 ` QObject::deleteLater()`에 연결하여 해당 스레드의 객체를 해제할 수 있습니다.

참고: 연관된 스레드가 ` terminate()`를 사용하여 종료된경우 , 이 신호가 어느 스레드에서 발신되는지는 정의되지 않습니다.

참고: 이 신호는 비공개 신호입니다. 신호 연결에서 사용할 수 있지만 사용자가 직접 발생시킬 수는 없습니다.

started()도 참조하십시오 .

[static noexcept] int QThread::idealThreadCount()

이 프로세스가 병렬로 실행할 수 있는 최적의 스레드 수를 반환합니다. 이는 이 프로세스가 사용할 수 있는 논리 프로세서 수(해당 OS에서 지원하는 경우) 또는 시스템의 총 논리 프로세서 수를 조회하여 수행됩니다. 두 값 모두 확인할 수 없는 경우 이 함수는 1을 반환합니다.

참고: 스레드의 어피니티를 모든 논리 프로세서의 일부로 설정하는 것을 지원하는 운영체제에서는 , 이 함수가 반환하는 값이 스레드마다 또는 시간이 지남에 따라 달라질 수 있습니다.

참고: CPU 핫플러그 및 핫언플러그를 지원하는 운영체제에서는 이 함수가 반환하는 값이 시간에 따라 변할 수도 있습니다(또한 CPU는 물리적 하드웨어 변경 없이 소프트웨어를 통해 켜고 끌 수 있다는 점에 유의하십시오).

[noexcept, since 6.8] bool QThread::isCurrentThread() const

이 스레드가 ` QThread::currentThread`인 경우 true를 반환합니다.

이 함수는 Qt 6.8에서 도입되었습니다.

currentThreadId()도 참조하십시오 .

bool QThread::isFinished() const

스레드가 완료된 경우 ` true `를 반환하고, 그렇지 않은 경우 ` false`를 반환합니다.

스레드는 run() 함수에서 반환되었고 finished() 신호가 발산된 경우 종료된 것으로 간주됩니다.

finished() 신호가 발산된 후에도 스레드는 thread_local 변수의 소멸자 실행과 같은 정리 작업을 수행하며 임의의 시간 동안 계속 실행될 수 있습니다. 스레드의 모든 효과와 동기화하려면 wait()를 호출하고 true가 반환되었는지 확인하십시오.

참고: 이 함수는 스레드 안전합니다.

isRunning()도 참조하십시오 .

bool QThread::isInterruptionRequested() const

이 스레드에서 실행 중인 작업이 중지되어야 하는 경우 true를 반환합니다. 작업 중단은 ` requestInterruption()`를 통해 요청할 수 있습니다.

이 함수는 장시간 실행되는 태스크를 안전하게 중단할 수 있도록 하는 데 사용할 수 있습니다. 이 함수가 반환하는 값을 확인하거나 이에 따라 조치를 취하지 않아도 안전하지만, 장시간 실행되는 함수에서는 정기적으로 확인하는 것이 좋습니다. 오버헤드를 최소화하기 위해 너무 자주 호출하지 않도록 주의하십시오.

void long_task() {
     forever {
        if ( QThread::currentThread()->isInterruptionRequested() ) {
            return;
        }
    }
}

참고: 이 함수는 해당 스레드 내부, 즉 현재 스레드일 때만 호출할 수 있습니다.

currentThread() 및 requestInterruption()도 참조하십시오 .

[static noexcept, since 6.8] bool QThread::isMainThread()

현재 실행 중인 스레드가 메인 스레드인지 여부를 반환합니다.

메인 스레드는 ` QCoreApplication `가 생성된 스레드입니다. 이는 일반적으로 ` main() ` 함수를 호출한 스레드이지만, 반드시 그런 것은 아닙니다. 이 스레드는 GUI 이벤트를 처리하며, 그래픽 객체(`QWindow`, ` QWidget`)를 생성할 수 있는 스레드입니다.

이 함수는 Qt 6.8에서 도입되었습니다.

currentThread() 및 QCoreApplication::instance()도 참조하십시오 .

bool QThread::isRunning() const

스레드가 실행 중이면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.

QThread 가 start()을 통해 시작되었으나 아직 완료되지 않은 경우, 해당 스레드는 실행 중인 것으로 간주됩니다.

finished() 신호가 발송된 후에도 스레드는 thread_local 변수의 소멸자 실행과 같은 정리 작업을 수행하며 임의의 시간 동안 계속 실행될 수 있다는 점에 유의하십시오. 스레드의 모든 효과와 동기화하려면 wait()를 호출하고 true가 반환되었는지 확인하십시오.

참고: 이 함수는 스레드 안전합니다.

isFinished()도 참조하십시오 .

int QThread::loopLevel() const

스레드의 현재 이벤트 루프 레벨을 반환합니다.

참고: 이 함수는 해당 스레드 내부, 즉 현재 스레드인 경우에만 호출할 수 있습니다.

[static] void QThread::msleep(unsigned long msecs)

이 함수는 오버로드된 함수이며, 다음을 호출하는 것과 동일합니다:

QThread::sleep(std::chrono::milliseconds{msecs});

참고: 이 함수는 정확성을 보장하지 않습니다. 부하가 심한 상황에서는 애플리케이션이 msecs 보다 더 오래 대기할 수 있습니다. 일부 운영 체제에서는 msecs 를 10 ms 또는 15 ms로 반올림할 수 있습니다.

sleep() 및 usleep()도 참조하십시오 .

QThread::Priority QThread::priority() const

실행 중인 스레드의 우선순위를 반환합니다. 스레드가 실행 중이 아닌 경우, 이 함수는 ` InheritPriority`를 반환합니다.

Priority, setPriority() 및 start()도 참조하십시오 .

[slot] void QThread::quit()

스레드의 이벤트 루프가 반환 코드 0(성공)으로 종료되도록 지시합니다. ` QThread::exit(0)`을 호출하는 것과 동일합니다.

스레드에 이벤트 루프가 없는 경우 이 함수는 아무 작업도 수행하지 않습니다.

참고: 이 함수는 스레드 안전합니다.

exit() 및 QEventLoop도 참조하십시오 .

void QThread::requestInterruption()

스레드의 중단을 요청합니다. 이 요청은 권고 사항일 뿐이며, 해당 요청에 따라 조치를 취할지 여부와 그 방법을 결정하는 것은 스레드에서 실행 중인 코드의 몫입니다. 이 함수는 스레드에서 실행 중인 이벤트 루프를 중지시키지 않으며, 어떠한 방식으로도 스레드를 종료하지 않습니다.

이 함수는 메인 스레드에는 아무런 영향을 미치지 않으며, 스레드가 현재 실행 중이 아닐 경우 아무런 작업도 수행하지 않습니다.

참고: 이 함수는 스레드 안전합니다.

isInterruptionRequested()도 참조하십시오 .

[virtual protected] void QThread::run()

스레드의 시작점입니다. ` start()`를 호출한 후, 새로 생성된 스레드가 이 함수를 호출합니다. 기본 구현은 단순히 ` exec()`를 호출합니다.

고급 스레드 관리를 용이하게 하기 위해 이 함수를 재구현할 수 있습니다. 이 메서드에서 반환되면 스레드의 실행이 종료됩니다.

start() 및 wait()도 참조하십시오 .

[since 6.9] QThread::QualityOfService QThread::serviceLevel() const

스레드의 현재 서비스 품질(QoS) 수준을 반환합니다.

이 함수는 Qt 6.9에서 도입되었습니다.

setServiceLevel() 및 QThreadPool::serviceLevel()도 참조하십시오 .

void QThread::setEventDispatcher(QAbstractEventDispatcher *eventDispatcher)

스레드의 이벤트 디스패처를 ` eventDispatcher`로 설정합니다. 이 작업은 해당 스레드에 아직 이벤트 디스패처가 설치되어 있지 않은 경우에만 가능합니다.

QCoreApplication 가 인스턴스화될 때 메인 스레드에 대한 이벤트 디스패처가 자동으로 생성되며, 보조 스레드의 경우 start()에서 생성됩니다.

이 메서드는 객체에 대한 소유권을 가져옵니다.

eventDispatcher()도 참조하십시오 .

void QThread::setPriority(QThread::Priority priority)

이 함수는 실행 중인 스레드의 우선순위( priority )를 설정합니다. 스레드가 실행 중이 아닌 경우, 이 함수는 아무 작업도 수행하지 않고 즉시 반환합니다. 특정 우선순위를 가진 스레드를 시작하려면 ` start()`를 사용하십시오.

priority 인수는 InheritPriority 를 제외한 QThread::Priority 열거형의 모든 값을 가질 수 있습니다.

priority 매개변수의 효과는 운영 체제의 스케줄링 정책에 따라 달라집니다. 특히, 스레드 우선순위를 지원하지 않는 시스템(예: Linux, 자세한 내용은 http://linux.die.net/man/2/sched_setscheduler 참조)에서는 priority 이 무시됩니다.

Priority, priority(), start()도 참조하십시오 .

[since 6.9] void QThread::setServiceLevel(QThread::QualityOfService serviceLevel)

스레드 객체의 서비스 품질(Quality of Service) 수준을 ‘ serviceLevel ’로 설정합니다. 이 함수는 해당 스레드 내부에서나 스레드가 시작되기 전에만 호출할 수 있습니다!

이 기능은 현재 Apple 플랫폼과 Windows에서만 구현되어 있습니다. 다른 플랫폼에서도 함수 호출은 성공적으로 완료되지만, 현재로서는 아무런 효과가 없습니다.

이 함수는 Qt 6.9에서 도입되었습니다.

serviceLevel() 및 QThreadPool::setServiceLevel()도 참조하십시오 .

void QThread::setStackSize(uint stackSize)

스레드의 스택 크기를 stackSize 바이트로 설정합니다. stackSize 값이 0인 경우, 운영 체제나 런타임이 기본값을 선택합니다. 그렇지 않은 경우, 스레드의 스택 크기는 지정된 값이 됩니다(이 값은 올림 또는 내림 처리될 수 있음).

대부분의 운영 체제에서 스택을 위해 할당되는 메모리 양은 처음에는 ` stackSize `보다 작으며, 스레드가 스택을 사용함에 따라 점차 증가합니다. 이 매개변수는 스택이 증가할 수 있는 최대 크기를 설정합니다(즉, 스택이 차지할 수 있는 가상 메모리 공간의 크기를 설정합니다).

이 함수는 스레드가 시작되기 전에만 호출할 수 있습니다.

경고: 대부분의 운영 체제에서는 스레드 스택 크기에 최소 및 최대 제한을 두습니다. 스택 크기가 이 제한 범위를 벗어날 경우 스레드가 시작되지 않습니다.

stackSize()도 참조하십시오 .

[static protected] void QThread::setTerminationEnabled(bool enabled = true)

enabled 매개변수에 따라 현재 스레드의 종료를 활성화하거나 비활성화합니다. 해당 스레드는 QThread 를 통해 시작되었어야 합니다.

enabled 가 false인 경우, 종료 기능이 비활성화됩니다. 이후 QThread::terminate()를 호출해도 아무런 효과 없이 즉시 반환됩니다. 대신, 종료 기능은 종료가 활성화될 때까지 보류됩니다.

enabled 가 true인 경우, 종료가 활성화됩니다. 이후 QThread::terminate() 호출은 스레드를 정상적으로 종료합니다. 종료가 연기된 상태(즉, QThread::terminate()가 종료 비활성화 상태로 호출된 경우)라면, 이 함수는 호출한 스레드를 즉시 종료합니다. 이 경우 이 함수는 반환되지 않는다는 점에 유의하십시오.

terminate()도 참조하십시오 .

[static, since 6.6] void QThread::sleep(std::chrono::nanoseconds nsecs)

현재 스레드가 ` nsecs` 동안 대기하도록 강제합니다.

특정 조건이 변경되기를 기다려야 하는 경우 이 함수의 사용을 피하십시오. 대신, 변경을 나타내는 신호에 슬롯을 연결하거나 이벤트 핸들러를 사용하십시오( QObject::event() 참조).

참고: 이 함수는 정확성을 보장하지 않습니다. 부하가 심한 상황에서는 애플리케이션이 nsecs 보다 더 오래 대기할 수 있습니다.

이 함수는 Qt 6.6에서 도입되었습니다.

[static] void QThread::sleep(unsigned long secs)

현재 스레드가 secs 초 동안 대기하도록 강제합니다.

이 함수는 오버로드된 함수이며, 다음 호출과 동일합니다:

QThread::sleep(std::chrono::seconds{secs});

msleep() 및 usleep()도 참조하십시오 .

uint QThread::stackSize() const

setStackSize() 함수로 설정된 경우, 해당 스레드의 최대 스택 크기를 바이트 단위로 반환합니다. 그렇지 않은 경우 0을 반환합니다.

setStackSize()도 참조하십시오 .

[slot] void QThread::start(QThread::Priority priority = InheritPriority)

run()를 호출하여 스레드의 실행을 시작합니다. 운영 체제는 priority 매개변수에 따라 스레드를 스케줄링합니다. 스레드가 이미 실행 중이라면 이 함수는 아무 작업도 수행하지 않습니다.

priority 매개변수의 효과는 운영 체제의 스케줄링 정책에 따라 달라집니다. 특히, 스레드 우선순위를 지원하지 않는 시스템(예: Linux, 자세한 내용은 sched_setscheduler 문서를 참조하십시오)에서는 priority 가 무시됩니다.

run() 및 terminate()도 참조하십시오 .

[private signal] void QThread::started()

이 신호는 관련 스레드가 실행을 시작할 때 해당 스레드에서 발신되므로, 이 신호에 연결된 모든 슬롯은 큐에 쌓인 호출을 통해 호출될 수 있습니다. run()이 호출되기 전에 이벤트가 게시되었을 수 있지만, 스레드 간 신호 전달은 여전히 대기 중일 수 있습니다.

참고: 이 신호는 비공개 신호입니다. 신호 연결에서 사용할 수 있지만 사용자가 직접 발송할 수는 없습니다.

run() 및 finished()도 참조하십시오 .

[slot] void QThread::terminate()

스레드의 실행을 종료합니다. 운영 체제의 스케줄링 정책에 따라 스레드가 즉시 종료될 수도 있고 그렇지 않을 수도 있습니다. 확실하게 하려면 terminate() 호출 후 QThread::wait()을 사용하십시오.

스레드가 종료되면, 해당 스레드의 완료를 기다리고 있던 모든 스레드가 깨어납니다.

경고: 이 함수는 위험하므로 사용을 권장하지 않습니다. 스레드는 코드 경로의 어느 지점에서든 종료될 수 있습니다. 데이터 수정 중에 스레드가 종료될 수도 있습니다. 스레드가 자체적으로 정리 작업을 수행하거나, 보유한 뮤텍스를 해제할 기회 등이 전혀 없습니다. 요컨대, 이 함수는 절대적으로 필요한 경우에만 사용하십시오.

QThread::setTerminationEnabled()를 호출하여 종료 기능을 명시적으로 활성화하거나 비활성화할 수 있습니다. 종료 기능이 비활성화된 상태에서 이 함수를 호출하면, 종료 기능이 다시 활성화될 때까지 종료가 연기됩니다. 자세한 내용은 QThread::setTerminationEnabled() 문서를 참조하십시오.

참고: 이 함수는 스레드 안전합니다.

setTerminationEnabled()도 참조하십시오 .

[static] void QThread::usleep(unsigned long usecs)

이 함수는 오버로드된 함수로, 다음을 호출하는 것과 동일합니다:

QThread::sleep(std::chrono::microseconds{secs});

참고: 이 함수는 정확성을 보장하지 않습니다. 부하가 심한 상황에서는 애플리케이션이 usecs 보다 더 오래 대기할 수 있습니다. 일부 OS에서는 usecs 를 10 ms 또는 15 ms로 올림 처리할 수 있으며, Windows에서는 1 ms의 배수로 올림 처리됩니다.

sleep() 및 msleep()도 참조하십시오 .

bool QThread::wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))

다음 조건 중 하나가 충족될 때까지 스레드를 차단합니다:

  • 이 ` QThread ` 객체와 연관된 스레드가 실행을 완료했을 때(즉, ` run()`에서 반환될 때). 이 함수는 스레드가 완료된 경우 `true`를 반환합니다. 또한 스레드가 아직 시작되지 않은 경우에도 `true`를 반환합니다.
  • deadline 에 도달합니다. 마감 시간에 도달하면 이 함수는 false를 반환합니다.

QDeadlineTimer::Forever 로 설정된(기본값) 마감 시간 타이머는 절대 타임아웃되지 않습니다. 이 경우, 함수는 스레드가 run()에서 반환되거나 스레드가 아직 시작되지 않은 경우에만 반환됩니다.

이는 POSIX의 ` pthread_join() ` 함수와 유사한 기능을 제공합니다.

참고: 일부 운영체제에서는 운영 체제 스레드가 여전히 실행 중이고 C++11 thread_local 소멸자 같은 정리 코드를 실행하고 있는 동안에도 이 함수가 true를 반환할 수 있습니다. OS 스레드가 완전히 종료된 후에만 이 함수가 true를 반환하는 운영 체제로는 Linux, Windows 및 Apple 운영 체제가 있습니다.

sleep() 및 terminate()도 참조하십시오 .

bool QThread::wait(unsigned long time)

time 는 밀리초 단위의 대기 시간입니다. time 의 값이 ULONG_MAX인 경우, 대기 작업은 절대 시간 초과되지 않습니다.

이 함수는 오버로드된 함수입니다.

[static] void QThread::yieldCurrentThread()

현재 스레드의 실행을 다른 실행 가능한 스레드가 있는 경우 해당 스레드로 양보합니다. 어떤 스레드로 전환할지는 운영 체제가 결정한다는 점에 유의하십시오.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.