Hopefully a workaround for crashes and hang ups at closing on Windows.

Release the OpenGL contexts not by a destructor of a static class,
but explicitely (predictively).
This commit is contained in:
bubnikv 2019-08-22 20:02:25 +02:00
parent c6604ff55d
commit 0de566e2a2
5 changed files with 22 additions and 6 deletions

View File

@ -48,6 +48,7 @@
#ifdef SLIC3R_GUI #ifdef SLIC3R_GUI
#include "slic3r/GUI/GUI.hpp" #include "slic3r/GUI/GUI.hpp"
#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_App.hpp"
#include "slic3r/GUI/3DScene.hpp"
#endif /* SLIC3R_GUI */ #endif /* SLIC3R_GUI */
using namespace Slic3r; using namespace Slic3r;
@ -505,7 +506,10 @@ int CLI::run(int argc, char **argv)
if (! m_extra_config.empty()) if (! m_extra_config.empty())
gui->mainframe->load_config(m_extra_config); gui->mainframe->load_config(m_extra_config);
}); });
return wxEntry(argc, argv); int result = wxEntry(argc, argv);
//FIXME this is a workaround for the PrusaSlicer 2.1 release.
_3DScene::destroy();
return result;
#else /* SLIC3R_GUI */ #else /* SLIC3R_GUI */
// No GUI support. Just print out a help. // No GUI support. Just print out a help.
this->print_help(false); this->print_help(false);

View File

@ -2007,6 +2007,11 @@ bool _3DScene::init(wxGLCanvas* canvas)
return s_canvas_mgr.init(canvas); return s_canvas_mgr.init(canvas);
} }
void _3DScene::destroy()
{
s_canvas_mgr.destroy();
}
GUI::GLCanvas3D* _3DScene::get_canvas(wxGLCanvas* canvas) GUI::GLCanvas3D* _3DScene::get_canvas(wxGLCanvas* canvas)
{ {
return s_canvas_mgr.get_canvas(canvas); return s_canvas_mgr.get_canvas(canvas);

View File

@ -647,6 +647,7 @@ public:
static void remove_all_canvases(); static void remove_all_canvases();
static bool init(wxGLCanvas* canvas); static bool init(wxGLCanvas* canvas);
static void destroy();
static GUI::GLCanvas3D* get_canvas(wxGLCanvas* canvas); static GUI::GLCanvas3D* get_canvas(wxGLCanvas* canvas);

View File

@ -197,11 +197,7 @@ GLCanvas3DManager::GLCanvas3DManager()
GLCanvas3DManager::~GLCanvas3DManager() GLCanvas3DManager::~GLCanvas3DManager()
{ {
if (m_context != nullptr) this->destroy();
{
delete m_context;
m_context = nullptr;
}
} }
bool GLCanvas3DManager::add(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar) bool GLCanvas3DManager::add(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar)
@ -282,6 +278,15 @@ bool GLCanvas3DManager::init(wxGLCanvas* canvas)
return false; return false;
} }
void GLCanvas3DManager::destroy()
{
if (m_context != nullptr)
{
delete m_context;
m_context = nullptr;
}
}
GLCanvas3D* GLCanvas3DManager::get_canvas(wxGLCanvas* canvas) GLCanvas3D* GLCanvas3DManager::get_canvas(wxGLCanvas* canvas)
{ {
CanvasesMap::const_iterator it = do_get_canvas(canvas); CanvasesMap::const_iterator it = do_get_canvas(canvas);

View File

@ -91,6 +91,7 @@ public:
void init_gl(); void init_gl();
bool init(wxGLCanvas* canvas); bool init(wxGLCanvas* canvas);
void destroy();
GLCanvas3D* get_canvas(wxGLCanvas* canvas); GLCanvas3D* get_canvas(wxGLCanvas* canvas);