From: Soeren Apel Date: Wed, 7 Jun 2017 16:18:24 +0000 (+0200) Subject: Fix #970 by making sure the session state handler can be called X-Git-Tag: pulseview-0.4.0~21 X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=ae1b6126c9a4e40ad2832e2b2e776f3a4a62e195 Fix #970 by making sure the session state handler can be called Before, the session did call Session::stop_capture() and fired the signal to notify of its capture state change. However, the Session object was deleted before the next run of the Qt event loop. As the Qt event loop dismisses signals originating from deleted objects, the connected event handler MainWindow::on_capture_state_changed() was never called. To remedy this, we call Session::stop_capture() before the destruction of the object and force a run of the event loop immediately afterwards. This way, the event handler is called and the run/stop button updated properly. --- diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index a20f12a6..9a3f197d 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -303,8 +303,18 @@ shared_ptr MainWindow::add_session() void MainWindow::remove_session(shared_ptr session) { + // Determine the height of the button before it collapses int h = new_session_button_->height(); + // Stop capture while the session still exists so that the UI can be + // updated in case we're currently running. If so, this will schedule a + // call to our on_capture_state_changed() slot for the next run of the + // event loop. We need to have this executed immediately or else it will + // be dismissed since the session object will be deleted by the time we + // leave this method and the event loop gets a chance to run again. + session->stop_capture(); + QApplication::processEvents(); + for (shared_ptr view : session->views()) remove_view(view); @@ -316,6 +326,7 @@ void MainWindow::remove_session(shared_ptr session) if (last_focused_session_ == session) last_focused_session_.reset(); + // Remove the session from our list of sessions (which also destroys it) sessions_.remove_if([&](shared_ptr s) { return s == session; });