Public Functions
void QThread::exit(int returnCode = 0)
告诉线程的事件循环需要退出,并且返回code
调用此函数后,线程离开事件循环并从对 QEventLoop::exec()
的调用返回。 QEventLoop::exec()
函数返回 returnCode,returnCode 为 0 表示成功,任何非零值表示错误。
在再次调用 QThread::exec()
之前,该线程中不会再启动 QEventLoops
。如果 QThread::exec()
中的事件循环没有运行,那么下一次调用 QThread::exec()
也将立即返回。
PS:该函数线程安全
bool QThread::isFinished() const
如果线程结束返回True
,否则返回False
。
PS:线程安全
bool QThread::isInterruptionRequested() const
如果该线程上运行的任务应该停止,则返回true。可以通过requestinterrupt()
请求中断。
此函数可用于使长时间运行的任务完全可中断。从不检查或操作此函数返回的值是安全的,但建议在长时间运行的函数中定期这样做。注意不要太频繁地调用它,以保持较低的开销
PS:Qt 5.2之后才有
void run() {while (!isInterruptionRequested()) {QMutexLocker lock(&m_mutex);// to do somethingmsleep(200);}
}// 暂停
void pause()
{m_mutex.lock();
}
// 继续
void resume()
{m_mutex.unlock();
}
// 退出线程
void exitThread()
{thd->requestInterruption();thd->wait();thd->deleteLater();thd = nullptr;
}
bool QThread::isRunning() const
如果线程在运行返回True
,否则返回False
。
PS:线程安全
与isFinished不同点可看QThread生命周期
void QThread::requestInterruption()
请求线程的中断。该请求是建议性的,由线程上运行的代码决定是否以及如何响应此类请求。此函数不会停止线程上运行的任何事件循环,也不会以任何方式终止它。
PS:线程安全
同isInterruptionRequested
一样,QT5.2才有
bool QThread::wait(QDeadlineTimer deadline = QDeadlineTimer(QDeadlineTimer::Forever))
阻止线程直到满足这些条件中的任何一个:
- 与此 QThread 对象关联的线程已完成执行(即,当它从 run() 返回时)。如果线程完成,该函数将返回 true。如果线程尚未启动,它也会返回 true。
- 截止日期已到。如果到达截止日期,该函数将返回 false。
设置为QDeadlineTimer::Forever
(默认值)的截止时间计时器永远不会超时。类似std::thread::join
。
PS:QT5.15 被引入
Public Slots
void QThread::quit()
告诉线程的事件循环退出并返回代码 0(成功)。相当于调用QThread::exit(0)
。
如果线程没有事件循环,则该函数不执行任何操作。
PS:线程安全
void QThread::start(QThread::Priority priority = InheritPriority)
通过调用run()
开始执行线程。操作系统会根据优先级参数来调度线程。如果线程已经在运行,则该函数不执行任何操作。
优先级参数的作用取决于操作系统的调度策略。特别是,在不支持线程优先级的系统上(例如在 Linux 上),优先级将被忽略。
多次调用start(),不会执行多次,只有完成后才会执行另一次
QThread对象,每次调用start函数,线程Id会变化,每次产生不同的线程Id
void QThread::terminate()
立即终止线程的执行。线程可能会也可能不会立即终止,具体取决于操作系统的调度策略。可以肯定的是,在终止()之后使用 QThread::wait()
。
警告:此功能很危险,不鼓励使用。
PS:永远不要使用该函数,该操作是非常危险的,因为你无法保证资源被安全释放(本人中过招doge)
Signals
void QThread::started()
在调用run()
函数之前,该信号开始执行时从关联线程开始执行时发出。
PS:这是private signal
void QThread::finished()
该信号是在关联线程完成执行之前发出的。
当发出该信号时,事件循环已经停止运行。除了延迟删除事件之外,线程中不会再处理任何事件。该信号可以连接到 QObject::deleteLater()
,以释放该线程中的对象。
PS:这是private signal
Static Public Members
QThread *QThread::currentThread()
顾名思义,返回当前线程指针
Qt::HANDLE QThread::currentThreadId()
返回当前正在执行的线程的线程句柄。
警告:此函数返回的句柄用于内部目的,不应在任何应用程序代码中使用。
注意:在 Windows 上,此函数返回由 Win32 函数 GetCurrentThreadId() 返回的 DWORD(Windows 线程 ID),而不是由 Win32 函数 GetCurrentThread() 返回的伪 HANDLE(Windows 线程 HANDLE)
void QThread::msleep(unsigned long msecs)
线程休眠
Protected Functions
virtual void run()
一般而言会重写run()
函数,而run内的内容就是子线程执行的内容,除此之外,其他成员函数的执行均在原线程。
线程的起点。调用start()
后,新创建的线程会调用该函数。
默认实现只是调用 exec()
。