diff --git a/tools/cabana/cabana.cc b/tools/cabana/cabana.cc index bb29a7e3a4..4a3b4126dd 100644 --- a/tools/cabana/cabana.cc +++ b/tools/cabana/cabana.cc @@ -91,7 +91,6 @@ int main(int argc, char *argv[]) { w.openStream(); } w.show(); - int ret = app.exec(); - delete can; - return ret; + + return app.exec(); } diff --git a/tools/cabana/streams/abstractstream.cc b/tools/cabana/streams/abstractstream.cc index 540634b9b7..2e6ca9662e 100644 --- a/tools/cabana/streams/abstractstream.cc +++ b/tools/cabana/streams/abstractstream.cc @@ -3,6 +3,7 @@ #include #include +#include #include "common/timing.h" #include "tools/cabana/settings.h" @@ -19,6 +20,7 @@ AbstractStream::AbstractStream(QObject *parent) : QObject(parent) { assert(parent != nullptr); event_buffer_ = std::make_unique(EVENT_NEXT_BUFFER_SIZE); + QObject::connect(QApplication::instance(), &QCoreApplication::aboutToQuit, this, &AbstractStream::stop); QObject::connect(this, &AbstractStream::privateUpdateLastMsgsSignal, this, &AbstractStream::updateLastMessages, Qt::QueuedConnection); QObject::connect(this, &AbstractStream::seekedTo, this, &AbstractStream::updateLastMsgsTo); QObject::connect(dbc(), &DBCManager::DBCFileChanged, this, &AbstractStream::updateMasks); diff --git a/tools/cabana/streams/replaystream.cc b/tools/cabana/streams/replaystream.cc index 3c3e431ce7..b1768fcdce 100644 --- a/tools/cabana/streams/replaystream.cc +++ b/tools/cabana/streams/replaystream.cc @@ -64,6 +64,10 @@ void ReplayStream::start() { replay->start(); } +void ReplayStream::stop() { + replay.reset(nullptr); +} + bool ReplayStream::eventFilter(const Event *event) { static double prev_update_ts = 0; if (event->which == cereal::Event::Which::CAN) { diff --git a/tools/cabana/streams/replaystream.h b/tools/cabana/streams/replaystream.h index e3278d9a32..049ccddafb 100644 --- a/tools/cabana/streams/replaystream.h +++ b/tools/cabana/streams/replaystream.h @@ -16,6 +16,7 @@ class ReplayStream : public AbstractStream { public: ReplayStream(QObject *parent); void start() override; + void stop() override; bool loadRoute(const QString &route, const QString &data_dir, uint32_t replay_flags = REPLAY_FLAG_NONE); bool eventFilter(const Event *event); void seekTo(double ts) override; diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index 6a159aa8e2..f477e327ee 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -56,6 +56,7 @@ Replay::~Replay() { stream_thread_->quit(); stream_thread_->wait(); delete stream_thread_; + stream_thread_ = nullptr; } timeline_future.waitForFinished(); rInfo("shutdown: done");