您当前的位置: 首页 >  qt

龚建波

暂无认证

  • 4浏览

    0关注

    312博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Qt中的多线程(二)

龚建波 发布时间:2019-01-12 14:17:19 ,浏览量:4

3.继承QThread并重写run()函数

QThread类提供了一个独立于平台的方式来管理线程。一个QThread对象管理程序内的控制的一个线程。QThread只有run()函数是在新线程里。默认情况下,run()通过调用exec()启动事件循环并在线程内运行Qt事件循环。

在旧版本中官方推荐的是该方法,在Qt4.8之后就建议moveToThread了。在文档中也能看到该方法示例。

引用一段文档描述:

线程将在run()函数返回后退出。除非你调用exec(),否则线程中不会运行任何事件循环。

重要的是要记住,QThread实例存在于实例化它的旧线程中,而不是在调用run()的新线程中。这意味着所有QThread的排队插槽都将在旧线程中执行。因此,希望在新线程中调用插槽的开发人员必须使用工作者 - 对象方法; 不应将新插槽直接实现到子类QThread。

在继承QThread时,请记住构造函数在旧线程中执行,而run()在新线程中执行。如果从两个函数访问成员变量,则从两个不同的线程访问该变量。检查这样做是否安全。(所以还是moveToThread好用啊)

  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()开启时间循环,或者QEventLoop。

4.使用QRunnable

先看看文档说明:

QRunnable类是所有Runnable对象的基类。

QRunnable类是一个接口,用于表示需要执行的任务或代码段,通过重新实现run()函数来表示。 

可以使用QThreadPool在单独的线程中执行代码。如果autoDelete()返回默认值true,QThreadPool会自动删除QRunnable。使用setAutoDelete()更改自动删除标志。

QThreadPool支持通过在run()函数中调用QThreadPool::tryStart(this)多次执行相同的QRunnable。如果启用了autoDelete,则当最后一个线程退出运行功能时,将删除QRunnable。启用autoDelete时,使用相同的QRunnable多次调用QThreadPool::start()会创建竞争条件,不建议这样做。

通过查看QThreadPool的文档,可以看到相关描述及代码示例:

QThreadPool类管理QThreads的集合。

QThreadPool管理和重新处理各个QThread对象,以帮助减少使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用getinstance()来访问它。

要使用其中一个QThreadPool线程,请继承QRunnable并实现run()虚函数。然后创建该类的对象并将其传递给QThreadPool::start()。

QThreadPool默认自动删除QRunnable。使用QRunnable::setAutoDelete()更改自动删除标志。

QThreadPool支持通过从QRunnable::run()中调用tryStart(this)多次执行相同的QRunnable。如果启用了autoDelete,则当最后一个线程退出运行功能时,将删除QRunnable。启用autoDelete时,使用相同的QRunnable多次调用start()会创建竞争条件,不建议这样做。

在一段时间内未使用的线程将过期。默认的到期超时为30000毫秒(30秒)。可以使用setExpiryTimeout()更改此设置。设置负到期超时会禁用到期机制。

调用maxThreadCount()以查询要使用的最大线程数。如果需要,您可以使用setMaxThreadCount()更改限制。默认的maxThreadCount()是QThread::idealThreadCount()。activeThreadCount()函数返回目前做的线程数工作。

reserveThread()函数保留外用线程。完成线程后使用reserveThread(),以便可以重用它。实质上,这些函数会临时增加或减少活动线程数,并且在实现QThreadPool不可见的耗时操作时非常有用。

请注意,QThreadPool是用于管理线程的低级类,请参阅Qt Concurrent模块以获取更高级别的替代方案。

  class HelloWorldTask : public QRunnable
  {
      void run()
      {
          qDebug()             
关注
打赏
1655829268
查看更多评论
0.1199s