Qt GUI应用程序在与gui交互时停止实时进程

时间:2016-12-31 14:25:13

标签: c++ multithreading qt user-interface

我有一个Qt GUI应用程序正在做一些重要的实时工作,不能不惜一切代价中断(通过LAN转发一些传入的串行流量)。当没有与GUI交互时应用程序运行完美,但只要您单击按钮或拖动表单,似乎转发在处理点击时停止。转发是在QTimer循环中完成的,我已经将其放在与GUI线程不同的线程上,但结果没有变化。 以下是代码的一些部分:

class MainWindow : public QMainWindow
{
    QSerialPort serialReceiver; // This is the serial object
    QTcpSocket *clientConnection;
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    // Some Initializations ...

    QThread* timerthread = new QThread(this); // This is the thread that is supposed to do the forwarding
    QTimer *timer = new QTimer(0);
    timer->setInterval(25);
    timer->moveToThread(timerthread);

    connect(timer ,SIGNAL(timeout()),this,SLOT(readserialData())); // Run readserialData() each 25ms
    timer->connect(timerthread, SIGNAL(started()), SLOT(start()));
    timerthread->start();
}


void MainWindow::readserialData()
{
    if(serialReceiver.isOpen() )
    {
        qint64 available = serialReceiver.bytesAvailable();
        if(available > 0)  // Read the serial if any data is available
        {    
            QByteArray serialReceivedData = serialReceiver.readAll(); // This line would not be executed when there is an interaction with the GUI
            if(isClientConnet)
            {
                int writedataNum = clientConnection->write(serialReceivedData);
            }
        }
    }
}

正如我之前所说,此代码在空闲情况下运行良好,没有任何数据丢失。我做错了吗?

1 个答案:

答案 0 :(得分:1)

在另一个线程中运行重要的实时工作是个好主意。 GUI线程或主要应该绘图,另一个应该进行处理。

Qt关于GUI线程的文档说:

  

GUI线程和工作线程   如上所述,每个程序在启动时都有一个线程。这个线程被称为"主线程" (也称为" GUI线程"在Qt应用程序中)。 Qt GUI必须在此线程中运行。所有小部件和几个相关的类(例如QPixmap)都不能在辅助线程中工作。辅助线程通常被称为"工作线程"因为它用于从主线程卸载处理工作。

以及何时使用多线程

  

使用线程   线程基本上有两种用例:   通过使用多核处理器加快处理速度。   通过卸载持久处理或阻止对其他线程的调用来保持GUI线程或其他时间关键线程的响应。

在您的情况下,在单独的线程中运行实时处理将修复UI滞后问题,并且还将解决实时性问题。

我建议你阅读Qt的文档中的线程基础知识。

Threading basics