QThread Class 详细描述
  QThread 类提供一个平台无关的方法来管理线程。
  一个QThread对象管理一个程序中的控制线程。QThread在run()中开始执行任务。默认地,run()通过调用exec()开始事件循环,并且在线程中运行Qt事件循环。
你可通过使用QObject::moveToThread()将worker对象移到线程中来使用worker对象。

  

class Worker : public QObject
  {
      Q_OBJECT

  public slots:
      void doWork(const QString &parameter) {
          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 &);
  };

  

  Worker槽中的代码会在一个单独的线程中执行。然而,你可以自由地将Woker的槽和任何信号相连,不管信号来自哪个对象,在哪个线程中。一个叫做queued connections的机制保证跨不同线程的信号(signals)和槽(slots)的连接(connect)是安全的。
  另外一种将代码运行在独立线程的方法是通过QThread的子类重新实现run()。例如:

 1 class WorkerThread : public QThread
 2   {
 3       Q_OBJECT
 4       void run() Q_DECL_OVERRIDE {
 5           QString result;
 6           /* ... here is the expensive or blocking operation ... */
 7           emit resultReady(result);
 8       }
 9   signals:
10       void resultReady(const QString &s);
11   };
12 
13   void MyObject::startWorkInAThread()
14   {
15       WorkerThread *workerThread = new WorkerThread(this);
16       connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
17       connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
18       workerThread->start();
19   }
View Code

相关文章: