2017-04-03 29 views
2

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

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

您需要另一个生活在工作线程中的对象(c.f.'moveToThread()')。您不能在'MainWindow'中使用插槽。 –

+1

我建议遵循[这篇优秀的文章]中描述的模式(https://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/ ) – TheDarkKnight

回答

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是你的主窗口,并Controller构造是你MainWindow::SerialRead()。虽然如果你想这样做,但要小心内存和线程管理,因为Controller是用来销毁存在的东西,而不是当线程完成时。

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

+0

感谢这个例子。顺便说一句'std :: thread'你的意思是使用pthreads。 pthread对于qt创建者来说是否工作得很好。或者你的意思是什么? –

+0

@SAndrew'std :: thread'是C++ 11。这是C++的新标准,它自己有一个线程实现。这是非常低的水平,你有很多的自由。你必须花几天的时间学习如何使用它,然后在一个严肃的程序中打招呼,但一旦你了解它,你就会喜欢它。在C++ 11推出后,我暂时停止使用QThread。 –

+0

请给我一个链接 –

-2

你可能不需要使用2个线程来做这样的事情。只是发出一个信号连接到setText(常量QString &),另一个信号连接到播放音频的插槽。串行数据的大小是多少?

+0

串行数据将是1或2的整数。基于此,我必须从文件中获取字符串并播放相应的音频。你能给我举一个例子吗 –

+0

@SAndrew在这种情况下,如果文件很小,音频很短,你可以在'MainWindow :: SerialRead'中做这两件事。您也可以在另一个线程中读取文件,但必须在主线程中显示它。您的串行数据触发多久? – GestureWei