QThread Class
QThread 클래스는 플랫폼에 독립적인 스레드 관리 방법을 제공합니다. 더 보기...
Header: | #include <QThread> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
상속합니다: | QObject |
- 상속된 멤버를 포함한 모든 멤버 목록
- QThread는 스레딩 클래스의 일부입니다.
공용 유형
enum | Priority { IdlePriority, LowestPriority, LowPriority, NormalPriority, HighPriority, …, InheritPriority } |
공용 함수
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() |
void | setEventDispatcher(QAbstractEventDispatcher *eventDispatcher) |
void | setPriority(QThread::Priority priority) |
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() |
시그널
정적 공용 멤버
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() |
보호된 함수
정적 보호 멤버
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 ¶meter) { 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 &); };
그러면 워커 슬롯 내부의 코드가 별도의 스레드에서 실행됩니다. 그러나 워커의 슬롯을 스레드의 모든 객체, 모든 신호에 자유롭게 연결할 수 있습니다. queued connections 이라는 메커니즘 덕분에 신호와 슬롯을 서로 다른 스레드에 연결해도 안전합니다.
코드를 별도의 스레드에서 실행하는 또 다른 방법은 QThread를 서브클래싱하고 run()를 다시 구현하는 것입니다. 예를 들어
class WorkerThread : public QThread { Q_OBJECT 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(); }
이 예제에서는 실행 함수가 반환된 후 스레드가 종료됩니다. 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()를 사용하여 다른 스레드의 실행이 끝날 때까지(또는 지정된 시간이 지날 때까지) 호출 스레드를 차단합니다.
sleep(), msleep() 및 usleep()는 각각 전체 초, 밀리초 및 마이크로초 해상도를 허용하는 정적, 플랫폼 독립적인 슬립 기능도 제공합니다.
참고: wait() 및 sleep() 함수는 Qt가 이벤트 중심 프레임워크이므로 일반적으로는 불필요합니다. wait () 대신 finished() 신호를 수신하는 것을 고려해 보세요. sleep () 함수 대신 QChronoTimer 을 사용하는 것이 좋습니다.
정적 함수 currentThreadId() 및 currentThread()은 현재 실행 중인 스레드의 식별자를 반환합니다. 전자는 스레드의 플랫폼별 ID를 반환하고, 후자는 QThread 포인터를 반환합니다.
스레드에 부여할 이름을 선택하려면(예를 들어 Linux에서 ps -L
명령으로 식별) 스레드를 시작하기 전에 setObjectName()을 호출하면 됩니다. setObjectName ()를 호출하지 않으면 스레드에 지정된 이름은 스레드 객체의 런타임 유형 클래스 이름이 됩니다(예: 만델브로트 예제의 경우 "RenderThread"
, 이는 QThread 서브클래스의 이름이기 때문입니다). 현재 Windows의 릴리스 빌드에서는 이 기능을 사용할 수 없습니다.
Qt의 스레드 지원, QThreadStorage, 스레드 동기화, 만델브로트, 세마포어를 사용한 생산자와 소비자, 대기 조건을 사용한 생산자와 소비자도참조하십시오 .
멤버 유형 문서
enum QThread::Priority
이 열거형 유형은 운영 체제에서 새로 생성된 스레드를 예약하는 방법을 나타냅니다.
Constant | 값 | 설명 |
---|---|---|
QThread::IdlePriority | 0 | 다른 스레드가 실행 중이 아닐 때만 스케줄링됩니다. |
QThread::LowestPriority | 1 | LowPriority보다 덜 자주 스케줄링됩니다. |
QThread::LowPriority | 2 | 보통 우선순위보다 덜 자주 스케줄링됩니다. |
QThread::NormalPriority | 3 | 운영 체제의 기본 우선순위입니다. |
QThread::HighPriority | 4 | NormalPriority보다 더 자주 예약됩니다. |
QThread::HighestPriority | 5 | HighPriority보다 더 자주 예약됩니다. |
QThread::TimeCriticalPriority | 6 | 가능한 한 자주 예약됩니다. |
QThread::InheritPriority | 7 | 생성 스레드와 동일한 우선순위를 사용합니다. 이것이 기본값입니다. |
멤버 함수 문서
[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 인스턴스의 소유권을 얻습니다.
start()도 참조하세요 .
[static]
QThread *QThread::currentThread()
현재 실행 중인 스레드를 관리하는 QThread 에 대한 포인터를 반환합니다.
[static noexcept]
Qt::HANDLE QThread::currentThreadId()
현재 실행 중인 스레드의 스레드 핸들을 반환합니다.
경고: 이 함수가 반환하는 핸들은 내부 용도로 사용되며 애플리케이션 코드에서 사용해서는 안 됩니다.
참고: Windows에서 이 함수는 Win32 함수 GetCurrentThread()가 반환하는 의사 핸들(Windows-Thread HANDLE)이 아닌 Win32 함수 GetCurrentThreadId()가 반환하는 DWORD(Windows-Thread 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() 내에서 호출해야 합니다. 이벤트 처리를 시작하려면 이 함수를 호출해야 합니다.
참고: 이 함수는 스레드 자체 내에서, 즉 현재 스레드인 경우에만 호출할 수 있습니다.
[slot]
void QThread::exit(int returnCode = 0)
스레드의 이벤트 루프에 반환 코드와 함께 종료하도록 지시합니다.
이 함수를 호출하면 스레드는 이벤트 루프에서 벗어나 QEventLoop::exec() 호출로 돌아갑니다. QEventLoop::exec () 함수는 returnCode 을 반환합니다.
일반적으로 0의 returnCode 은 성공을 의미하며, 0이 아닌 값은 오류를 나타냅니다.
같은 이름의 C 라이브러리 함수와 달리 이 함수는 호출자에게 반환되며 이벤트 처리가 중지된다는 점에 유의하세요.
QThread::exec()가 다시 호출될 때까지 이 스레드에서 더 이상 QEventLoops가 시작되지 않습니다. 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 인 경우 참을 반환합니다.
이 함수는 Qt 6.8에 도입되었습니다.
currentThreadId()도 참조하십시오 .
bool QThread::isFinished() const
스레드가 완료되면 true
을 반환하고, 그렇지 않으면 false
을 반환합니다.
참고: 이 함수는 스레드에 안전합니다.
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
을 반환합니다.
참고: 이 함수는 스레드에 안전합니다.
isFinished()도 참조하세요 .
int QThread::loopLevel() const
스레드의 현재 이벤트 루프 레벨을 반환합니다.
참고: 스레드 자체 내에서, 즉 현재 스레드인 경우에만 호출할 수 있습니다.
[static]
void QThread::msleep(unsigned long msecs)
이 함수는 호출에 해당하는 오버로드된 함수입니다:
QThread::sleep(std::chrono::milliseconds{msecs});
참고: 이 함수는 정확성을 보장하지 않습니다. 과부하 상태에서는 애플리케이션이 msecs 보다 더 오래 절전 상태가 될 수 있습니다. 일부 OS에서는 msecs 을 10밀리초 또는 15밀리초로 반올림할 수 있습니다.
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()를 호출하기만 합니다.
이 함수를 재구현하여 고급 스레드 관리를 용이하게 할 수 있습니다. 이 메서드에서 반환하면 스레드 실행이 종료됩니다.
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()도 참조하세요 .
void QThread::setStackSize(uint stackSize)
스레드의 스택 크기를 stackSize 으로 설정합니다. stackSize 이 0이면 운영 체제 또는 런타임에서 기본값을 선택합니다. 그렇지 않으면 스레드의 스택 크기는 제공된 값(반올림 또는 반내림될 수 있음)이 됩니다.
대부분의 운영 체제에서 스택을 제공하기 위해 할당된 메모리의 양은 처음에는 stackSize 보다 작으며 스레드가 스택을 사용함에 따라 커집니다. 이 매개변수는 스택이 커질 수 있는 최대 크기를 설정합니다(즉, 스택이 차지할 수 있는 가상 메모리 공간의 크기를 설정합니다).
이 함수는 스레드가 시작되기 전에만 호출할 수 있습니다.
경고: 대부분의 운영 체제에서는 스레드 스택 크기에 최소 및 최대 제한을 두고 있습니다. 스택 크기가 이 제한을 벗어나면 스레드가 시작되지 않습니다.
stackSize()도 참조하세요 .
[static protected]
void QThread::setTerminationEnabled(bool enabled = true)
enabled 매개변수에 따라 현재 스레드의 종료를 활성화 또는 비활성화합니다. 스레드는 QThread 에 의해 시작되어야 합니다.
enabled 이 거짓이면 종료가 비활성화됩니다. 향후 QThread::terminate()에 대한 호출은 효과 없이 즉시 반환됩니다. 대신 종료가 활성화될 때까지 종료가 연기됩니다.
enabled 이 참이면 종료가 활성화됩니다. 앞으로 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});
uint QThread::stackSize() const
스레드의 최대 스택 크기를 반환합니다( setStackSize()로 설정한 경우). 그렇지 않으면 0을 반환합니다.
setStackSize()도 참조하세요 .
[slot]
void QThread::start(QThread::Priority priority = InheritPriority)
run()를 호출하여 스레드 실행을 시작합니다. 운영 체제는 priority 매개 변수에 따라 스레드를 예약합니다. 스레드가 이미 실행 중이면 이 함수는 아무 작업도 수행하지 않습니다.
priority 매개 변수의 효과는 운영 체제의 스케줄링 정책에 따라 달라집니다. 특히 스레드 우선 순위를 지원하지 않는 시스템(예: Linux, 자세한 내용은 sched_setscheduler 문서를 참조하세요)에서는 priority 가 무시됩니다.
[private signal]
void QThread::started()
이 신호는 실행이 시작될 때 연결된 스레드에서 방출되므로 연결된 모든 슬롯이 대기열 호출을 통해 호출될 수 있습니다. run ()가 호출되기 전에 이벤트가 게시되었을 수 있지만, 신호의 교차 스레드 전달은 여전히 보류 중일 수 있습니다.
참고: 이것은 비공개 신호입니다. 신호 연결에서 사용할 수 있지만 사용자가 방출할 수는 없습니다.
[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밀리초 또는 15밀리초로 반올림할 수 있으며, Windows에서는 1밀리초의 배수로 반올림됩니다.
bool QThread::wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
이 조건 중 하나가 충족될 때까지 스레드를 차단합니다:
- 이 QThread 객체와 연결된 스레드가 실행을 완료한 경우(즉, run()에서 반환되는 경우). 스레드가 완료되면 이 함수는 참을 반환합니다. 스레드가 아직 시작되지 않은 경우에도 참을 반환합니다.
- deadline 에 도달했습니다. 이 함수는 마감일에 도달하면 false를 반환합니다.
QDeadlineTimer::Forever
(기본값)으로 설정된 마감 기한 타이머는 시간 초과되지 않습니다. 이 경우 이 함수는 스레드가 run()에서 반환되거나 스레드가 아직 시작되지 않은 경우에만 반환됩니다.
이 함수는 POSIX pthread_join()
함수와 유사한 기능을 제공합니다.
sleep() 및 terminate()도 참조하세요 .
bool QThread::wait(unsigned long time)
이것은 과부하된 함수입니다.
time 는 밀리초 단위의 대기 시간입니다. time 가 ULONG_MAX이면 대기 시간이 초과되지 않습니다.
[static]
void QThread::yieldCurrentThread()
현재 스레드를 실행 가능한 다른 스레드(있는 경우)로 실행을 전환합니다. 전환할 스레드는 운영 체제에서 결정합니다.
© 2025 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.