我是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;
}
我怎样才能完成上述任务。任何人都可以请我参考一些有用的链接或文章。感谢
答案 0 :(得分:1)
虽然我强烈建议你使用std::thread
代替QThread,但这是你的电话。但是,在Qt docs page of QThread上有一个非常好的例子,完全符合你的需要。这是:
class Worker : public QObject
{
Q_OBJECT
public slots:
void doWork(const QString ¶meter) {
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&)的信号,另一个信号连接到插槽以播放音频。串行数据的大小是多少?