如何在qt中使用线程

时间:2017-04-03 06:36:27

标签: c++ multithreading qt

我是QT的新手。我需要为某些目的使用线程。我在QT中搜索了很多关于线程的内容,但是所有的文章和视频都使用了同样的例子。他们正在使用对话框并放置带有2个按钮的标签,以在标签上打印一些数据。我想在MainWindow中使用线程。我的应用程序包括读取串行数据,然后在标签上显示相关信息。该信息包含字符串和音频文件。需要同时播放字符串和音频文件。我有一个连接信号用于串行读取,如下所示:

connect(&Serial, SIGNAL(readyRead()), this, SLOT(SerialRead()));

QString MainWindow::SerialRead()
{
  word Words; //
  QString serialData = Serial.readAll();              //Reading Serial Data
  //Now here I want to start the two threads
  //Thread 1 to display string
  //Thread 2 to play audio
  return 0;

}

我怎样才能完成上述任务。任何人都可以请我参考一些有用的链接或文章。感谢

2 个答案:

答案 0 :(得分:1)

虽然我强烈建议你使用std::thread代替QThread,但这是你的电话。但是,在Qt docs page of QThread上有一个非常好的例子,完全符合你的需要。这是:

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 &);
};

基本上,在此示例中,Controller是您的MainWindow,而Controller的构造函数是您的MainWindow::SerialRead()。如果你想这样做,请注意内存和线程管理,因为Controller会在存在时破坏它,而不是在线程完成时。

因此,您可以按原样使用该控制器(只需在MainWindow::SerialRead()中对其进行实例化),或者将其更改为包含MainWindow中的部分控制器。

答案 1 :(得分:-2)

您可能不需要使用2个线程来执行此类操作。只发出一个连接到setText(const QString&)的信号,另一个信号连接到插槽以播放音频。串行数据的大小是多少?