From 6a3a9c0bc59989db959d7379db45985c42c8c949 Mon Sep 17 00:00:00 2001 From: Bartosz Taudul Date: Sat, 28 Jul 2018 18:47:33 +0200 Subject: [PATCH] Load second trace on a separate thread. --- server/TracyView.cpp | 23 ++++++++++++++++------- server/TracyView.hpp | 1 + 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/server/TracyView.cpp b/server/TracyView.cpp index 573100a1..071c0651 100644 --- a/server/TracyView.cpp +++ b/server/TracyView.cpp @@ -283,6 +283,8 @@ View::~View() { m_worker.Shutdown(); + if( m_compare.loadThread.joinable() ) m_compare.loadThread.join(); + assert( s_instance != nullptr ); s_instance = nullptr; } @@ -4469,7 +4471,7 @@ void View::DrawCompare() if( !m_compare.second ) { ImGui::TextWrapped( "Please load a second trace to compare results." ); - if( ImGui::Button( "Open second trace" ) ) + if( ImGui::Button( "Open second trace" ) && !m_compare.loadThread.joinable() ) { nfdchar_t* fn; auto res = NFD_OpenDialog( "tracy", nullptr, &fn ); @@ -4477,16 +4479,21 @@ void View::DrawCompare() { try { - auto f = std::unique_ptr( tracy::FileRead::Open( fn ) ); + auto f = std::shared_ptr( tracy::FileRead::Open( fn ) ); if( f ) { - m_compare.second = std::make_unique( *f, EventType::None ); + m_compare.loadThread = std::thread( [this, f] { + try + { + m_compare.second = std::make_unique( *f, EventType::None ); + } + catch( const tracy::UnsupportedVersion& e ) + { + m_compare.badVer = e.version; + } + } ); } } - catch( const tracy::UnsupportedVersion& e ) - { - m_compare.badVer = e.version; - } catch( const tracy::NotTracyDump& e ) { m_compare.badVer = -1; @@ -4498,6 +4505,8 @@ void View::DrawCompare() return; } + if( m_compare.loadThread.joinable() ) m_compare.loadThread.join(); + if( !m_worker.AreSourceLocationZonesReady() || !m_compare.second->AreSourceLocationZonesReady() ) { ImGui::TextWrapped( "Please wait, computing data..." ); diff --git a/server/TracyView.hpp b/server/TracyView.hpp index 6344b630..2285a640 100644 --- a/server/TracyView.hpp +++ b/server/TracyView.hpp @@ -279,6 +279,7 @@ private: struct { bool show = false; std::unique_ptr second; + std::thread loadThread; int badVer = 0; char pattern[1024] = {}; std::vector match[2];