diff --git a/CMakeLists.txt b/CMakeLists.txt index 9e5aa9e..8c94951 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,7 +115,7 @@ if (MINGW) set (CMAKE_PREFIX_PATH ${MINGW_BASE_DIR} ) endif () -find_package (Qt6 6.2 REQUIRED COMPONENTS Core Gui Widgets PrintSupport Xml Svg LinguistTools Test) +find_package (Qt6 6.2 REQUIRED COMPONENTS Concurrent Core Gui Widgets PrintSupport Xml Svg LinguistTools Test) if (WIN32) # Locate Qt directories diff --git a/glabels/CMakeLists.txt b/glabels/CMakeLists.txt index 7ef4010..34ea793 100644 --- a/glabels/CMakeLists.txt +++ b/glabels/CMakeLists.txt @@ -138,6 +138,7 @@ target_include_directories (glabels-qt target_link_libraries (glabels-qt Model + Qt6::Concurrent Qt6::Widgets ) diff --git a/glabels/PrintView.cpp b/glabels/PrintView.cpp index f2b28db..350a8a0 100644 --- a/glabels/PrintView.cpp +++ b/glabels/PrintView.cpp @@ -48,8 +48,8 @@ namespace glabels auto* printerMonitor = PrinterMonitor::instance(); loadDestinations( printerMonitor->availablePrinters() ); - connect( printerMonitor, SIGNAL(availablePrintersChanged(const QStringList&)), - this, SLOT(onAvailablePrintersChanged(const QStringList&)) ); + connect( printerMonitor, SIGNAL(availablePrintersChanged(QStringList)), + this, SLOT(onAvailablePrintersChanged(QStringList)) ); setDestination( model::Settings::recentPrinter() ); @@ -74,7 +74,7 @@ namespace glabels /// /// Available printers changed handler /// - void PrintView::onAvailablePrintersChanged( const QStringList& printers ) + void PrintView::onAvailablePrintersChanged( QStringList printers ) { auto savedSelection = destinationCombo->currentText(); loadDestinations( printers ); diff --git a/glabels/PrintView.h b/glabels/PrintView.h index bd12b14..92893d1 100644 --- a/glabels/PrintView.h +++ b/glabels/PrintView.h @@ -57,7 +57,7 @@ namespace glabels // Slots ///////////////////////////////// private slots: - void onAvailablePrintersChanged( const QStringList& printers ); + void onAvailablePrintersChanged( QStringList printers ); void onModelChanged(); void updateView(); void onFormChanged(); diff --git a/glabels/PrinterMonitor.cpp b/glabels/PrinterMonitor.cpp index 358a9fd..0256c17 100644 --- a/glabels/PrinterMonitor.cpp +++ b/glabels/PrinterMonitor.cpp @@ -21,8 +21,10 @@ #include "PrinterMonitor.h" -#include #include +#include +#include +#include namespace glabels @@ -39,11 +41,13 @@ namespace glabels /// PrinterMonitor::PrinterMonitor() { + using namespace std::chrono_literals; + mCurrentAvailablePrinters = QPrinterInfo::availablePrinterNames(); mTimer.reset( new QTimer( this ) ); connect( mTimer.get(), SIGNAL(timeout()), this, SLOT(onTimerTimeout()) ); - mTimer->start( 1000 ); + mTimer->start( 10s ); } @@ -64,8 +68,9 @@ namespace glabels /// /// Get available printers /// - const QStringList& PrinterMonitor::availablePrinters() const + QStringList PrinterMonitor::availablePrinters() { + QMutexLocker mutex( &mCurrentAvailablePrintersMutex ); return mCurrentAvailablePrinters; } @@ -74,10 +79,25 @@ namespace glabels /// On timer timeout /// void PrinterMonitor::onTimerTimeout() + { + // Make sure previous poll is complete before starting a new one + if ( mPollStatus.isFinished() ) + { + mPollStatus = QtConcurrent::run( &PrinterMonitor::asyncPoll, this ); + } + } + + + /// + /// Asynchronous poll + /// + void PrinterMonitor::asyncPoll() { auto newAvailablePrinters = QPrinterInfo::availablePrinterNames(); if ( newAvailablePrinters != mCurrentAvailablePrinters ) { + QMutexLocker mutex( &mCurrentAvailablePrintersMutex ); + mCurrentAvailablePrinters = newAvailablePrinters; emit availablePrintersChanged( mCurrentAvailablePrinters ); diff --git a/glabels/PrinterMonitor.h b/glabels/PrinterMonitor.h index 0639b25..52e0869 100644 --- a/glabels/PrinterMonitor.h +++ b/glabels/PrinterMonitor.h @@ -22,6 +22,8 @@ #define PrinterMonitor_h +#include +#include #include #include #include @@ -53,7 +55,7 @@ namespace glabels // Public methods ///////////////////////////////// public: - const QStringList& availablePrinters() const; + QStringList availablePrinters(); ///////////////////////////////// @@ -67,7 +69,14 @@ namespace glabels // Signals ///////////////////////////////// signals: - void availablePrintersChanged( const QStringList& availablePrinters ); + void availablePrintersChanged( QStringList availablePrinters ); + + + ///////////////////////////////// + // Private methods + ///////////////////////////////// + private: + void asyncPoll(); ///////////////////////////////// @@ -77,8 +86,11 @@ namespace glabels static std::unique_ptr mInstance; std::unique_ptr mTimer; + QStringList mCurrentAvailablePrinters; + QMutex mCurrentAvailablePrintersMutex; + QFuture mPollStatus; }; }