gpt4 book ai didi

c++ - qt中线程的使用方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:43:56 24 4
gpt4 key购买 nike

我是 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,但这由您决定。但是,在 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 是在它存在时销毁它,而不是在线程完成时销毁它。

因此您要么按原样使用该 Controller (只需在您的 MainWindow::SerialRead() 中对其进行实例化),要么更改它以将其部分内容包含在您的 MainWindow 中.

关于c++ - qt中线程的使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43177952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com