diff align/Align.cpp @ 761:6429a164b7e1 pitch-align

Schedule alignments with a small delay to avoid too much UI unresponsiveness. Also overhaul error reporting to use signals throughout.
author Chris Cannam
date Wed, 06 May 2020 11:45:27 +0100
parents 39808338e771
children dd742e566e60
line wrap: on
line diff
--- a/align/Align.cpp	Mon Apr 27 14:59:56 2020 +0100
+++ b/align/Align.cpp	Wed May 06 11:45:27 2020 +0100
@@ -18,12 +18,35 @@
 #include "framework/Document.h"
 
 #include <QSettings>
+#include <QTimer>
 
-bool
+void
 Align::alignModel(Document *doc,
                   ModelId reference,
-                  ModelId toAlign,
-                  QString &error)
+                  ModelId toAlign)
+{
+    addAligner(doc, reference, toAlign);
+    m_aligners[toAlign]->begin();
+}
+
+void
+Align::scheduleAlignment(Document *doc,
+                         ModelId reference,
+                         ModelId toAlign)
+{
+    addAligner(doc, reference, toAlign);
+    int delay = 500 + 500 * int(m_aligners.size());
+    if (delay > 3500) {
+        delay = 3500;
+    }
+    SVCERR << "Align::scheduleAlignment: delaying " << delay << "ms" << endl;
+    QTimer::singleShot(delay, m_aligners[toAlign].get(), SLOT(begin()));
+}
+
+void
+Align::addAligner(Document *doc,
+                  ModelId reference,
+                  ModelId toAlign)
 {
     bool useProgram;
     QString program;
@@ -56,8 +79,9 @@
 
     connect(aligner.get(), SIGNAL(complete(ModelId)),
             this, SLOT(alignerComplete(ModelId)));
-    
-    return aligner->begin(error);
+
+    connect(aligner.get(), SIGNAL(failed(ModelId, QString)),
+            this, SLOT(alignerFailed(ModelId, QString)));
 }
 
 void
@@ -87,23 +111,33 @@
 void
 Align::alignerComplete(ModelId alignmentModel)
 {
-    Aligner *aligner = qobject_cast<Aligner *>(sender());
+    removeAligner(sender());
+    emit alignmentComplete(alignmentModel);
+}
+
+void
+Align::alignerFailed(ModelId toAlign, QString error)
+{
+    removeAligner(sender());
+    emit alignmentFailed(toAlign, error);
+}
+
+void
+Align::removeAligner(QObject *obj)
+{
+    Aligner *aligner = qobject_cast<Aligner *>(obj);
     if (!aligner) {
-        SVCERR << "ERROR: Align::alignerComplete: Caller is not an Aligner"
-               << endl;
+        SVCERR << "ERROR: Align::removeAligner: Not an Aligner" << endl;
         return;
     }
 
-    {
-        QMutexLocker locker (&m_mutex);
+    QMutexLocker locker (&m_mutex);
 
-        for (auto p: m_aligners) {
-            if (aligner == p.second.get()) {
-                m_aligners.erase(p.first);
-                break;
-            }
+    for (auto p: m_aligners) {
+        if (aligner == p.second.get()) {
+            m_aligners.erase(p.first);
+            break;
         }
     }
+}
 
-    emit alignmentComplete(alignmentModel);
-}