diff --git a/explaintreemodelitem.cpp b/explaintreemodelitem.cpp index eb89702..0c26192 100644 --- a/explaintreemodelitem.cpp +++ b/explaintreemodelitem.cpp @@ -51,9 +51,9 @@ namespace { } // END of unnamed namespace -std::unique_ptr ExplainRoot::createFromJson(Json::Value &json) +ExplainRoot::SPtr ExplainRoot::createFromJson(Json::Value &json) { - auto res = std::make_unique(); + auto res = std::make_shared(); // Explain always seems to be an array with one element if (json.isArray()) { if (json.size() > 0) { diff --git a/explaintreemodelitem.h b/explaintreemodelitem.h index dc8982e..9c99f14 100644 --- a/explaintreemodelitem.h +++ b/explaintreemodelitem.h @@ -128,7 +128,8 @@ private: class ExplainRoot { public: - static std::unique_ptr createFromJson(Json::Value &json); + using SPtr = std::shared_ptr; + static SPtr createFromJson(Json::Value &json); ExplainTreeModelItemPtr plan; float planningTime = 0.f; diff --git a/mainwindow.cpp b/mainwindow.cpp index b89d96f..ebd7dd9 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -213,9 +213,10 @@ void MainWindow::performExplain() QString command = "EXPLAIN (ANALYZE, VERBOSE, BUFFERS, FORMAT JSON) "; command += ui->queryEdit->toPlainText(); - explainFuture = std::async(std::launch::async, [this,command]()-> std::unique_ptr +// explainFuture = std::async(std::launch::async, [this,command]()-> std::unique_ptr + std::thread([this,command]() { - std::unique_ptr explain; + std::shared_ptr explain; auto res = connection->query(command); if (res.getCols() == 1 && res.getRows() == 1) { std::string s = res.getVal(0, 0); @@ -226,16 +227,14 @@ void MainWindow::performExplain() explain = ExplainRoot::createFromJson(root); } } - QMetaObject::invokeMethod(this, "explain_ready", Qt::QueuedConnection); // queues on main thread - return explain; - }); + QueueTask([this, explain]() { explain_ready(explain); }); + }).detach(); } -void MainWindow::explain_ready() +void MainWindow::explain_ready(ExplainRoot::SPtr explain) { - std::unique_ptr explain(explainFuture.get()); if (explain) { - explainModel.reset(new QueryExplainModel(nullptr, std::move(explain))); + explainModel.reset(new QueryExplainModel(nullptr, explain)); ui->explainTreeView->setModel(explainModel.get()); ui->explainTreeView->expandAll(); ui->explainTreeView->setColumnWidth(0, 200); diff --git a/mainwindow.h b/mainwindow.h index 6329310..0bf59ec 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -60,7 +60,7 @@ private: std::unique_ptr explainModel; Pgsql::Canceller queryCancel; - std::future> explainFuture; + struct { std::unique_ptr notifier; @@ -74,6 +74,7 @@ private: void processNotice(const PGresult *result); void query_ready(Pgsql::Result res); + void explain_ready(std::shared_ptr explain); private slots: void startConnect(); @@ -81,7 +82,7 @@ private slots: void performQuery(); void performExplain(); void socket_activate_connect(int socket); - void explain_ready(); + void cancel_query(); void receiveNotice(Pgsql::ErrorDetails notice); diff --git a/queryexplainmodel.cpp b/queryexplainmodel.cpp index fd9a44c..a1c1552 100644 --- a/queryexplainmodel.cpp +++ b/queryexplainmodel.cpp @@ -11,8 +11,7 @@ const int c_ColumnLoops = 5; const int c_ColumnDetails = 6; const int c_NumberOfColumns = 7; -QueryExplainModel::QueryExplainModel(QObject *parent, - std::unique_ptr exp) +QueryExplainModel::QueryExplainModel(QObject *parent, ExplainRoot::SPtr exp) : QAbstractItemModel(parent) , explain(std::move(exp)) {} diff --git a/queryexplainmodel.h b/queryexplainmodel.h index 117308f..913ce3d 100644 --- a/queryexplainmodel.h +++ b/queryexplainmodel.h @@ -8,7 +8,7 @@ class QueryExplainModel : public QAbstractItemModel { Q_OBJECT public: - explicit QueryExplainModel(QObject *parent, std::unique_ptr exp); + explicit QueryExplainModel(QObject *parent, ExplainRoot::SPtr exp); QVariant data(const QModelIndex &index, int role) const override; @@ -27,5 +27,5 @@ public: int columnCount(const QModelIndex &parent = QModelIndex()) const override; private: - std::unique_ptr explain; + ExplainRoot::SPtr explain; };