如何在 qt 中使用线程

How to use threads in qt

本文关键字:线程 qt      更新时间:2023-10-16

我是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;
}

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

虽然我强烈建议您使用std::thread而不是QThread,但这是您的决定。但是,在QThread的Qt文档页面上,有一个非常好的例子,完全符合您的需求。这是:

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是你的主窗口,Controller的构造函数是你的MainWindow::SerialRead()。但是,如果要这样做,请小心内存和线程管理,因为该Controller是在存在时销毁事物,而不是在线程完成时销毁。

因此,您要么按原样使用该控制器(只需在MainWindow::SerialRead()中实例化它(,要么将其更改为将其部分包含在MainWindow中。

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