From 3dc08e964c7a3e6199db64172cbbfc3d09a9cbdc Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Wed, 11 May 2016 13:26:34 +0900 Subject: [PATCH] [UI][Qt][DRAW] Fix crash sometimes when exit emulator. --- source/src/qt/common/qt_utils.cpp | 4 ++++ source/src/qt/gui/mainwidget_base.h | 1 + source/src/qt/gui/qt_gldraw.cpp | 6 ++++++ source/src/qt/gui/qt_gldraw.h | 5 ++++- source/src/qt/gui/qt_glutil.cpp | 2 +- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/source/src/qt/common/qt_utils.cpp b/source/src/qt/common/qt_utils.cpp index ba415b78e..da2453ba0 100644 --- a/source/src/qt/common/qt_utils.cpp +++ b/source/src/qt/common/qt_utils.cpp @@ -110,6 +110,8 @@ void Ui_MainWindow::LaunchEmuThread(void) connect(hRunEmu, SIGNAL(sig_is_enable_mouse(bool)), glv, SLOT(do_set_mouse_enabled(bool))); connect(glv, SIGNAL(sig_key_down(uint32_t, uint32_t, bool)), hRunEmu, SLOT(do_key_down(uint32_t, uint32_t, bool))); connect(glv, SIGNAL(sig_key_up(uint32_t, uint32_t)), hRunEmu, SLOT(do_key_up(uint32_t, uint32_t))); + connect(this, SIGNAL(sig_quit_widgets()), glv, SLOT(do_stop_run_vm())); + //connect(hRunEmu, SIGNAL(sig_finished()), this, SLOT(delete_emu_thread())); connect(this, SIGNAL(sig_vm_reset()), hRunEmu, SLOT(doReset())); @@ -360,6 +362,8 @@ void Ui_MainWindow::OnMainWindowClosed(void) emit quit_draw_thread(); emit quit_joy_thread(); emit quit_emu_thread(); + emit sig_quit_widgets(); + if(hDrawEmu != NULL) { hDrawEmu->wait(); delete hDrawEmu; diff --git a/source/src/qt/gui/mainwidget_base.h b/source/src/qt/gui/mainwidget_base.h index 03780af8b..22f3b4445 100644 --- a/source/src/qt/gui/mainwidget_base.h +++ b/source/src/qt/gui/mainwidget_base.h @@ -624,6 +624,7 @@ signals: int sig_start_auto_key(QString); int sig_stop_auto_key(void); int quit_debugger_thread(void); + int sig_quit_widgets(void); }; QT_END_NAMESPACE diff --git a/source/src/qt/gui/qt_gldraw.cpp b/source/src/qt/gui/qt_gldraw.cpp index fc019a955..4956dced9 100644 --- a/source/src/qt/gui/qt_gldraw.cpp +++ b/source/src/qt/gui/qt_gldraw.cpp @@ -125,6 +125,8 @@ GLDrawClass::GLDrawClass(QWidget *parent) draw_height = using_flags->get_screen_height(); delay_update = false; is_mouse_enabled = false; + + run_vm = true; this->initKeyCode(); } @@ -164,3 +166,7 @@ QSize GLDrawClass::getDrawSize(void) return QSize(draw_width, draw_height); } +void GLDrawClass::do_stop_run_vm() +{ + run_vm = false; +} diff --git a/source/src/qt/gui/qt_gldraw.h b/source/src/qt/gui/qt_gldraw.h index 29197bc2b..7bac2744d 100644 --- a/source/src/qt/gui/qt_gldraw.h +++ b/source/src/qt/gui/qt_gldraw.h @@ -45,6 +45,8 @@ class GLDrawClass: public QGLWidget bool delay_update; protected: + bool run_vm; + void keyReleaseEvent(QKeyEvent *event); void keyPressEvent(QKeyEvent *event); void initializeGL(); @@ -64,7 +66,7 @@ class GLDrawClass: public QGLWidget void SaveToPixmap(void); GLDraw_2_0 *extfunc; CSP_KeyTables *key_table; - + public: GLDrawClass(QWidget *parent = 0); ~GLDrawClass(); @@ -120,6 +122,7 @@ public slots: void do_set_screen_multiply(float mul); void do_update_keyboard_scan_code(uint32_t vk, uint32_t scan); void do_set_mouse_enabled(bool flag); + void do_stop_run_vm(); signals: void update_screenChanged(int tick); void do_notify_move_mouse(int x, int y); diff --git a/source/src/qt/gui/qt_glutil.cpp b/source/src/qt/gui/qt_glutil.cpp index d45893633..5970a92e3 100644 --- a/source/src/qt/gui/qt_glutil.cpp +++ b/source/src/qt/gui/qt_glutil.cpp @@ -23,7 +23,7 @@ void GLDrawClass::update_screen(bitmap_t *p) { //if(tick < (1000 / 75)) tick = 1000 / 75; - if(p != NULL) { + if((p != NULL) && (run_vm)) { this->makeCurrent(); //imgptr = &(p->pImage); drawUpdateTexture(p); -- 2.11.0