【QT】QThread 成员函数

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 something

	msleep(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()

相关推荐

  1. 【QT】QThread 成员函数

    2024-01-20 12:16:02       40 阅读
  2. 成员函数

    2024-01-20 12:16:02       48 阅读
  3. 【C++ const成员函数使用】

    2024-01-20 12:16:02       55 阅读
  4. C++默认成员函数(二)

    2024-01-20 12:16:02       52 阅读
  5. const修饰的成员函数

    2024-01-20 12:16:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-20 12:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-20 12:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-20 12:16:02       82 阅读
  4. Python语言-面向对象

    2024-01-20 12:16:02       91 阅读

热门阅读

  1. 十种较流行的网络安全框架及特点分析

    2024-01-20 12:16:02       57 阅读
  2. Curl- go的自带包 net/http实现

    2024-01-20 12:16:02       59 阅读
  3. mysql 5.7 函数汇总

    2024-01-20 12:16:02       62 阅读
  4. ZAB算法

    2024-01-20 12:16:02       51 阅读