@ -20,7 +20,8 @@
EmuThread : : EmuThread ( GRenderWindow * render_window ) :
exec_cpu_step ( false ) , cpu_running ( false ) ,
render_window ( render_window ) , filename ( " " )
render_window ( render_window ) , filename ( " " ) ,
stop_run ( false )
{
}
@ -31,6 +32,7 @@ void EmuThread::SetFilename(std::string filename)
void EmuThread : : run ( )
{
stop_run = false ;
while ( true )
{
for ( int tight_loop = 0 ; tight_loop < 10000 ; + + tight_loop )
@ -41,11 +43,17 @@ void EmuThread::run()
exec_cpu_step = false ;
Core : : SingleStep ( ) ;
if ( ! cpu_running )
if ( ! cpu_running ) {
emit CPUStepped ( ) ;
yieldCurrentThread ( ) ;
}
}
}
QMutexLocker lock ( & mutex ) ;
if ( stop_run )
break ;
}
render_window - > moveContext ( ) ;
Core : : Stop ( ) ;
}
@ -58,16 +66,24 @@ void EmuThread::Stop()
return ;
}
{
QMutexLocker lock ( & mutex ) ;
stop_run = true ;
}
//core::g_state = core::SYS_DIE;
wait ( 1000 ) ;
wait ( 5 00) ;
if ( isRunning ( ) )
{
WARN_LOG ( MASTER_LOG , " EmuThread still running, terminating... " ) ;
terminate ( ) ;
quit ( ) ;
wait ( 1000 ) ;
if ( isRunning ( ) )
{
WARN_LOG ( MASTER_LOG , " EmuThread STILL running, something is wrong here... " ) ;
terminate ( ) ;
}
}
INFO_LOG ( MASTER_LOG , " EmuThread stopped " ) ;
}
@ -116,7 +132,6 @@ GRenderWindow::GRenderWindow(QWidget* parent) : QWidget(parent), emu_thread(this
layout - > setMargin ( 0 ) ;
setLayout ( layout ) ;
QObject : : connect ( & emu_thread , SIGNAL ( started ( ) ) , this , SLOT ( moveContext ( ) ) ) ;
QObject : : connect ( & emu_thread , SIGNAL ( finished ( ) ) , this , SLOT ( moveContext ( ) ) ) ;
BackupGeometry ( ) ;
}
@ -127,13 +142,14 @@ void GRenderWindow::moveContext()
// We need to move GL context to the swapping thread in Qt5
# if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
// If the thread started running, move the GL Context to the new thread. Otherwise, move it back.
child - > context ( ) - > moveToThread ( emu_thread . isRunning ( ) ? & emu_thread : qApp - > thread ( ) ) ;
child - > context ( ) - > moveToThread ( ( QThread : : currentThread ( ) = = qApp - > thread ( ) ) ? & emu_thread : qApp - > thread ( ) ) ;
# endif
}
GRenderWindow : : ~ GRenderWindow ( )
{
emu_thread . Stop ( ) ;
if ( emu_thread . isRunning ( ) )
emu_thread . Stop ( ) ;
}
void GRenderWindow : : SwapBuffers ( )
@ -144,7 +160,8 @@ void GRenderWindow::SwapBuffers()
void GRenderWindow : : closeEvent ( QCloseEvent * event )
{
emu_thread . Stop ( ) ;
if ( emu_thread . isRunning ( ) )
emu_thread . Stop ( ) ;
QWidget : : closeEvent ( event ) ;
}