我有一个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);
}
}
}
}
正如我之前所说,此代码在空闲情况下运行良好,没有任何数据丢失。我做错了吗?
答案 0 :(得分:1)
在另一个线程中运行重要的实时工作是个好主意。 GUI线程或主要应该绘图,另一个应该进行处理。
Qt关于GUI线程的文档说:
GUI线程和工作线程 如上所述,每个程序在启动时都有一个线程。这个线程被称为"主线程" (也称为" GUI线程"在Qt应用程序中)。 Qt GUI必须在此线程中运行。所有小部件和几个相关的类(例如QPixmap)都不能在辅助线程中工作。辅助线程通常被称为"工作线程"因为它用于从主线程卸载处理工作。
以及何时使用多线程
使用线程 线程基本上有两种用例: 通过使用多核处理器加快处理速度。 通过卸载持久处理或阻止对其他线程的调用来保持GUI线程或其他时间关键线程的响应。
在您的情况下,在单独的线程中运行实时处理将修复UI滞后问题,并且还将解决实时性问题。
我建议你阅读Qt的文档中的线程基础知识。