@@ -730,9 +730,6 @@ void TestQgsTaskManager::taskId()
730
730
731
731
void TestQgsTaskManager::waitForFinished ()
732
732
{
733
- if ( QgsTest::isTravis () )
734
- QSKIP ( " This test is disabled on Travis CI environment" );
735
-
736
733
QgsTaskManager manager;
737
734
QEventLoop loop;
738
735
@@ -742,33 +739,72 @@ void TestQgsTaskManager::waitForFinished()
742
739
if ( finishedTask->status () != QgsTask::Running )
743
740
loop.exec ();
744
741
745
- QTimer timer;
746
- connect ( &timer, &QTimer::timeout, finishedTask, &ProgressReportingTask::finish );
747
- timer.start ( 100 );
742
+ // we have to run the timer in a different thread, because waitForFinished will block this thread, meaning the
743
+ // event loop never runs and the timer timeout signal never gets through...
744
+ QThread *timerThread = new QThread ();
745
+ connect ( timerThread, &QThread::finished, timerThread, &QThread::deleteLater );
746
+ QTimer *timer = new QTimer ( nullptr );
747
+ connect ( timer, &QTimer::timeout, finishedTask, &ProgressReportingTask::finish, Qt::DirectConnection );
748
+ timer->moveToThread ( timerThread );
749
+ connect ( timerThread, &QThread::started, timer, [ = ]
750
+ {
751
+ timer->start ( 2000 );
752
+ } );
753
+ connect ( timerThread, &QThread::finished, timer, &QTimer::deleteLater );
754
+ timerThread->start ();
755
+
748
756
QCOMPARE ( finishedTask->waitForFinished (), true );
749
757
QCOMPARE ( finishedTask->status (), QgsTask::Complete );
750
758
759
+ timerThread->quit ();
760
+
751
761
ProgressReportingTask *failedTask = new ProgressReportingTask ();
752
762
connect ( failedTask, &ProgressReportingTask::begun, &loop, &QEventLoop::quit );
753
763
manager.addTask ( failedTask );
754
764
if ( failedTask->status () != QgsTask::Running )
755
765
loop.exec ();
756
766
757
- connect ( &timer, &QTimer::timeout, failedTask, &ProgressReportingTask::terminate );
758
- timer.start ( 100 );
767
+ timerThread = new QThread ();
768
+ connect ( timerThread, &QThread::finished, timerThread, &QThread::deleteLater );
769
+ timer = new QTimer ( nullptr );
770
+ connect ( timer, &QTimer::timeout, failedTask, &ProgressReportingTask::terminate, Qt::DirectConnection );
771
+ timer->moveToThread ( timerThread );
772
+ connect ( timerThread, &QThread::started, timer, [ = ]
773
+ {
774
+ timer->start ( 500 );
775
+ } );
776
+ connect ( timerThread, &QThread::finished, timer, &QTimer::deleteLater );
777
+ timerThread->start ();
778
+
759
779
QCOMPARE ( failedTask->waitForFinished (), true );
760
780
QCOMPARE ( failedTask->status (), QgsTask::Terminated );
761
781
782
+ timerThread->quit ();
783
+
762
784
ProgressReportingTask *timeoutTooShortTask = new ProgressReportingTask ();
763
785
connect ( timeoutTooShortTask, &ProgressReportingTask::begun, &loop, &QEventLoop::quit );
764
786
manager.addTask ( timeoutTooShortTask );
765
787
if ( timeoutTooShortTask->status () != QgsTask::Running )
766
788
loop.exec ();
767
789
768
- connect ( &timer, &QTimer::timeout, timeoutTooShortTask, &ProgressReportingTask::finish );
769
- timer.start ( 1000 );
790
+ timerThread = new QThread ();
791
+ connect ( timerThread, &QThread::finished, timerThread, &QThread::deleteLater );
792
+ timer = new QTimer ( nullptr );
793
+ connect ( timer, &QTimer::timeout, timeoutTooShortTask, &ProgressReportingTask::finish, Qt::DirectConnection );
794
+ timer->moveToThread ( timerThread );
795
+ connect ( timerThread, &QThread::started, timer, [ = ]
796
+ {
797
+ timer->start ( 1000 );
798
+ } );
799
+ connect ( timerThread, &QThread::finished, timer, &QTimer::deleteLater );
800
+ timerThread->start ();
801
+
770
802
QCOMPARE ( timeoutTooShortTask->waitForFinished ( 20 ), false );
771
803
QCOMPARE ( timeoutTooShortTask->status (), QgsTask::Running );
804
+
805
+ timerThread->quit ();
806
+
807
+ flushEvents ();
772
808
}
773
809
774
810
void TestQgsTaskManager::progressChanged ()
0 commit comments