Qt GUI 应用程序在与 gui 交互时停止实时进程
Posted
技术标签:
【中文标题】Qt GUI 应用程序在与 gui 交互时停止实时进程【英文标题】:Qt GUI application stops realtime process when interacting with gui 【发布时间】:2016-12-31 14:25:13 【问题描述】:我有一个 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);
正如我之前所说,这段代码在空闲情况下运行良好,没有任何数据丢失。我做错了吗?
【问题讨论】:
也许***.com/questions/19252608/… 会帮助你 我不会亲自将 UI 和真正重要的工作混为一谈。我会考虑将 Redis 放在两者之间。 【参考方案1】:在另一个线程中运行重要的实时工作是个好主意。 GUI 线程或主线程应该进行绘图,而另一个应该进行处理。
Qt 关于 GUI 线程的文档说:
GUI线程和工作线程 如前所述,每个程序在启动时都有一个线程。该线程称为“主线程”(在 Qt 应用程序中也称为“GUI 线程”)。 Qt GUI 必须在这个线程中运行。所有小部件和几个相关的类,例如 QPixmap,都不能在辅助线程中工作。辅助线程通常被称为“工作线程”,因为它用于从主线程卸载处理工作。
以及何时使用多线程
使用线程 线程基本上有两个用例: 利用多核处理器加快处理速度。 通过将长期处理或阻塞调用卸载到其他线程来保持 GUI 线程或其他时间关键线程的响应。
在您的情况下,在单独的线程中运行实时处理将解决 UI 滞后问题,也将解决实时性问题。
我建议您阅读 Qt 文档中的线程基础知识。
Threading basics
【讨论】:
以上是关于Qt GUI 应用程序在与 gui 交互时停止实时进程的主要内容,如果未能解决你的问题,请参考以下文章