From 8f732962d021300311a1cd351afc5a4b7f9587d2 Mon Sep 17 00:00:00 2001 From: Toni Uhlig Date: Thu, 5 Oct 2023 00:49:25 +0200 Subject: Fix UI freeze while processing (large) PCAP files. * allow closing the application as well while doing so Signed-off-by: Toni Uhlig --- mainwindow.cpp | 14 ++++++++++++++ mainwindow.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/mainwindow.cpp b/mainwindow.cpp index 9b6534d..efaf5b7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -244,8 +244,16 @@ MainWindow::MainWindow(QWidget *parent) if (!ppp) throw std::runtime_error("PcapPlusPlus was not initialized."); isProcessing = true; + const QDateTime startTime = QDateTime::currentDateTime(); while (ppp->processPacket(packet)) { + if (isAboutToClose) + break; + emit onPacketAvailable(); + + const QDateTime currentTime = QDateTime::currentDateTime(); + if (startTime.msecsTo(currentTime) % 100 == 0) + qApp->processEvents(); } ui->tableWidget->clearSelection(); isProcessing = false; @@ -315,6 +323,12 @@ pcpp::RawPacket* MainWindow::currentSelectedPacket() return &ppp->getRawPacket(selected.last()->row()); } +void MainWindow::closeEvent(QCloseEvent *closeEvent) +{ + isAboutToClose = true; + closeEvent->accept(); +} + bool MainWindow::eventFilter(QObject *obj __attribute__((unused)), QEvent *event) { if (event->type() == QEvent::MouseMove) diff --git a/mainwindow.h b/mainwindow.h index 88b78c9..bd51110 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -26,6 +26,7 @@ public: bool updateTableRow(size_t index); private: + void closeEvent(QCloseEvent *bar); bool eventFilter(QObject *obj, QEvent *event); void updateStatusBarMessage(const QString & message); @@ -52,6 +53,7 @@ private: Ui::MainWindow *ui = nullptr; QString statusbarMessage; PcapPlusPlus *ppp = nullptr; + std::atomic isAboutToClose = false; std::atomic isProcessing = false; signals: -- cgit v1.2.3