Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 31 additions & 17 deletions src/qmapshack/gis/rte/router/CRouterBRouter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ CRouterBRouter::CRouterBRouter(QWidget* parent) : IRouter(false, parent) {
timerCloseStatusMsg->setInterval(5000);
connect(timerCloseStatusMsg, &QTimer::timeout, this, &CRouterBRouter::slotCloseStatusMsg);

timerSynchronousRequest = new QTimer(this);
timerSynchronousRequest->setSingleShot(true);
timerSynchronousRequest->setInterval(300);

routerSetup = dynamic_cast<CRouterSetup*>(parent);

connect(toolConsole, &QToolButton::clicked, this, &CRouterBRouter::slotToggleConsole);
Expand Down Expand Up @@ -181,7 +185,6 @@ void CRouterBRouter::slotCloseStatusMsg() const {
timerCloseStatusMsg->stop();
CCanvas* canvas = CMainWindow::self().getVisibleCanvas();
if (canvas) {
canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
canvas->reportStatus("BRouter", "");
}
}
Expand Down Expand Up @@ -298,32 +301,38 @@ int CRouterBRouter::calcRoute(const QPointF& p1, const QPointF& p2, QPolygonF& c

int CRouterBRouter::synchronousRequest(const QVector<QPointF>& points, const QList<IGisItem*>& nogos, QPolygonF& coords,
qreal* costs = nullptr) noexcept(false) {
if (!mutex.tryLock()) {
// skip further on-the-fly-requests as long a previous request is still running
if (isCalculating) {
if (!timerSynchronousRequest->isActive()) {
emit sigCancelRouting();
}
return -1;
}

timerSynchronousRequest->start();
isCalculating = true;

if (setup->installMode == CRouterBRouterSetup::eModeLocal && localBRouter->isBRouterNotRunning()) {
localBRouter->startBRouter();
}

synchronous = true;

QNetworkReply* reply = networkAccessManager->get(getRequest(points, nogos));

try {
reply->setProperty("synchronous", true);
reply->setProperty("options", getOptions());
reply->setProperty("time", QDateTime::currentDateTimeUtc().toMSecsSinceEpoch());

CProgressDialog progress(tr("Calculate route with %1").arg(getOptions()), 0, NOINT, nullptr);

QEventLoop eventLoop;
connect(this, &CRouterBRouter::sigCancelRouting, reply, &QNetworkReply::abort);
connect(&progress, &CProgressDialog::rejected, reply, &QNetworkReply::abort);
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
eventLoop.exec(QEventLoop::AllEvents);

const QNetworkReply::NetworkError& netErr = reply->error();
if (netErr == QNetworkReply::RemoteHostClosedError && nogos.size() > 1 && !isMinimumVersion(1, 4, 10)) {
if (netErr == QNetworkReply::OperationCanceledError) {
throw QString();
} else if (netErr == QNetworkReply::RemoteHostClosedError && nogos.size() > 1 && !isMinimumVersion(1, 4, 10)) {
throw tr("this version of BRouter does not support more then 1 nogo-area");
} else if (netErr != QNetworkReply::NoError) {
throw reply->errorString();
Expand Down Expand Up @@ -381,8 +390,10 @@ int CRouterBRouter::synchronousRequest(const QVector<QPointF>& points, const QLi
}
}
} catch (const QString& msg) {
coords.clear();
reply->deleteLater();
mutex.unlock();
timerSynchronousRequest->stop();
isCalculating = false;
if (!msg.isEmpty()) {
throw tr("Bad response from server: %1").arg(msg);
}
Expand All @@ -391,18 +402,23 @@ int CRouterBRouter::synchronousRequest(const QVector<QPointF>& points, const QLi

reply->deleteLater();
slotCloseStatusMsg();
mutex.unlock();
timerSynchronousRequest->stop();
isCalculating = false;
return coords.size();
}

void CRouterBRouter::calcRoute(const IGisItem::key_t& key) {
mutex.lock();
if (isCalculating) {
return;
}
isCalculating = true;

if (setup->installMode == CRouterBRouterSetup::eModeLocal && localBRouter->isBRouterNotRunning()) {
localBRouter->startBRouter();
}

CGisItemRte* rte = dynamic_cast<CGisItemRte*>(CGisWorkspace::self().getItemByKey(key));
if (nullptr == rte) {
mutex.unlock();
return;
}

Expand All @@ -418,10 +434,9 @@ void CRouterBRouter::calcRoute(const IGisItem::key_t& key) {
points << QPointF(pt.lon, pt.lat);
}

synchronous = false;

QNetworkReply* reply = networkAccessManager->get(getRequest(points, nogos));

reply->setProperty("synchronous", false);
reply->setProperty("key.item", key.item);
reply->setProperty("key.project", key.project);
reply->setProperty("key.device", key.device);
Expand All @@ -430,7 +445,6 @@ void CRouterBRouter::calcRoute(const IGisItem::key_t& key) {

CCanvas* canvas = CMainWindow::self().getVisibleCanvas();
if (canvas) {
canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
canvas->reportStatus("BRouter", tr("<b>BRouter</b><br/>Routing request sent to server. Please wait..."));
}

Expand All @@ -440,7 +454,7 @@ void CRouterBRouter::calcRoute(const IGisItem::key_t& key) {
}

void CRouterBRouter::slotRequestFinished(QNetworkReply* reply) {
if (synchronous) {
if (reply->property("synchronous").toBool()) {
return;
}

Expand Down Expand Up @@ -492,13 +506,13 @@ void CRouterBRouter::slotRequestFinished(QNetworkReply* reply) {
}
timerCloseStatusMsg->start();
reply->deleteLater();
mutex.unlock();
isCalculating = false;
return;
}
}

slotCloseStatusMsg();
mutex.unlock();
isCalculating = false;
}

void CRouterBRouter::slotToggleConsole() const {
Expand Down
7 changes: 5 additions & 2 deletions src/qmapshack/gis/rte/router/CRouterBRouter.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ class CRouterBRouter : public IRouter, private Ui::IRouterBRouter {

void setupLocalDir(QString localDir);

signals:
void sigCancelRouting();

public slots:
void slotToolSetupClicked();

Expand Down Expand Up @@ -79,8 +82,8 @@ class CRouterBRouter : public IRouter, private Ui::IRouterBRouter {

QNetworkAccessManager* networkAccessManager;
QTimer* timerCloseStatusMsg;
bool synchronous = false;
QMutex mutex;
bool isCalculating{false};
QTimer* timerSynchronousRequest;
CRouterBRouterSetup* setup;
CRouterSetup* routerSetup;
CRouterBRouterInfo* info;
Expand Down
3 changes: 1 addition & 2 deletions src/qmapshack/gis/rte/router/brouter/CRouterBRouterLocal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,7 @@ void CRouterBRouterLocal::startBRouter() {

while (timer.remainingTime() > 0 && brouterState == QProcess::Running) {
socket.connectToHost(brouter.setup->localHost, brouter.setup->localPort.toInt());
// Processing userinputevents in local eventloop would cause a SEGV when clicking 'abort' of calling LineOp
connectState = connect_state_e(eventLoop->exec(QEventLoop::ExcludeUserInputEvents));
connectState = connect_state_e(eventLoop->exec(QEventLoop::AllEvents));

// retry after 100ms, but only in case socket is not yet connectable
if (connectState == eError && socketError == QAbstractSocket::ConnectionRefusedError) {
Expand Down