Qt之QThread

简述

QThread类提供了与系统无关的线程。

QThread代表在程序中一个单独的线程控制。线程在run()中开始执行,默认情况下,run()通过调用exec()启动事件循环并在线程里运行一个Qt的事件循环。

  • 简述
  • 线程管理
  • 常用接口

线程管理

QThread会通知你触发了一个信号,当线程started()和finished()时,或使用isFinished()和isRunning()来查询线程的状态。

可以通过调用exit()或quit()来停止线程。在极端情况下,可能要强行terminate()一个执行线程。但是,这样做很危险。请阅读文档查看terminate()和setTerminationEnabled()的详细信息。

从Qt4.8起,可以释放运行刚刚结束的线程对象,通过连接finished()信号到QObject::deleteLater()。
使用wait()来阻塞调用的线程,直到其它线程执行完毕(或者直到指定的时间过去)。

QThread中还提供了静态的、平台独立的休眠功能:sleep()、msleep()、usleep()允许秒,毫秒和微秒来区分,这些函数在Qt5.0中被设为public。

注意:一般情况下,wait()和sleep()函数应该不需要,因为Qt是一个事件驱动型框架。考虑监听finished()信号来取代wait(),使用QTimer来取代sleep()。

静态函数currentThreadId()和currentThread()返回标识当前正在执行的线程。前者返回该线程平台特定的ID,后者返回一个线程指针。

要设置线程的名称,可以在启动线程之前调用setObjectName()。如果不调用setObjectName(),线程的名称将是线程对象的运行时类型(QThread子类的类名)。

常用接口

下面,我们将常用的接口按照功能进行分类:

  • 线程启动

    • void start(Priority priority = InheritPriority)
      调用后会执行run()函数,但在run()函数执行前会发射信号started(),操作系统将根据优先级参数调度线程。如果线程已经在运行,那么这个函数什么也不做。优先级参数的效果取决于操作系统的调度策略。特别是那些不支持线程优先级的系统优先级将会被忽略(例如在Linux中,更多细节请参考http://linux.die.net/man/2/sched_setscheduler)。
  • 线程执行

    • int exec()
      进入事件循环并等待直到调用exit(),返回值是通过调用exit()来获得,如果调用成功则范围0。

    • virtual void run();
      线程的起点,在调用start()之后,新创建的线程就会调用这个函数,默认实现调用exec(),大多数需要重新实现这个功能,便于管理自己的线程。该方法返回时,该线程的执行将结束。

  • 线程退出

    • void quit()
      告诉线程事件循环退出,返回0表示成功,相当于调用了QThread::exit(0)。

    • void exit(int returnCode = 0)
      告诉线程事件循环退出。
      调用这个函数后,线程离开事件循环后返回,QEventLoop::exec()返回returnCode,按照惯例,0表示成功,任何非0值表示失败。

    • void terminate()
      终止线程,线程可能会立即被终止也可能不会,这取决于操作系统的调度策略,使用terminate()之后再使用QThread::wait()确保万无一失。
      当线程被终止后,所有等待中的线程将会被唤醒。
      警告:此功能比较危险,不鼓励使用。线程可以在代码执行的任何点被终止。线程可能在更新数据时被终止,从而没有机会来清理自己,解锁等等。。。总之,只有在绝对必要时使用此功能。
      建议:一般情况下,都在run函数里面设置一个标识符,可以控制循环停止。然后才调用quit函数,退出线程。

  • 线程等待

    • void msleep(unsigned long msecs)
      强制当前线程睡眠msecs毫秒

    • void sleep(unsigned long secs)
      强制当前线程睡眠secs秒

    • void usleep(unsigned long usecs)
      强制当前线程睡眠usecs微秒

    • bool wait(unsigned long time = ULONG_MAX);
      线程将会被阻塞,等待time毫秒。和sleep不同的是,如果线程退出,wait会返回。

  • 线程状态

    • bool isFinished() const
      线程是否结束

    • bool isRunning() const
      线程是否正在运行

  • 线程优先级

    • void setPriority(Priority priority)
      设置正在运行线程的优先级。如果线程没有运行,此功能不执行任何操作并立即返回。使用的start()来启动一个线程具有特定的优先级。优先级参数可以是QThread::Priority枚举除InheritPriortyd的任何值。

枚举QThread::Priority:

常量 描述
QThread::IdlePriority 0 没有其它线程运行时才调度
QThread::LowestPriority 1 比LowPriority调度频率低
QThread::LowPriority 2 比NormalPriority调度频率低
QThread::NormalPriority 3 操作系统的默认优先级
QThread::HighPriority 4 比NormalPriority调度频繁
QThread::HighestPriority 5 比HighPriority调度频繁
QThread::TimeCriticalPriority 6 尽可能频繁的调度
QThread::InheritPriority 7 使用和创建线程同样的优先级. 这是默认值

你可能感兴趣的:(qt,QThread,Qt-run,Qt线程,Qt多线程)