From 3b0577c733e8b6da52b6a55241f7faba80edb79c Mon Sep 17 00:00:00 2001 From: LoRd_MuldeR Date: Sun, 27 Oct 2013 16:13:14 +0100 Subject: [PATCH] More improvements in Splash Screen (application initialization) code. It's now completely event-driven. --- res/localization/LameXP_UK.qm | Bin 89934 -> 90236 bytes src/Config.h | 2 +- src/Dialog_SplashScreen.cpp | 157 +++++++++++++++++++--------------- src/Dialog_SplashScreen.h | 30 ++++++- 4 files changed, 117 insertions(+), 72 deletions(-) diff --git a/res/localization/LameXP_UK.qm b/res/localization/LameXP_UK.qm index 96408eeffb93e9288bb82ec283b3033a5ca0c976..5bc114a9d509ba6c0120d6fad2c48c2289ad4aec 100644 GIT binary patch delta 4561 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 delta 4427 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 diff --git a/src/Config.h b/src/Config.h index a0b30a99..9219abc9 100644 --- a/src/Config.h +++ b/src/Config.h @@ -35,7 +35,7 @@ #define VER_LAMEXP_MINOR_LO 9 #define VER_LAMEXP_TYPE Alpha #define VER_LAMEXP_PATCH 4 -#define VER_LAMEXP_BUILD 1427 +#define VER_LAMEXP_BUILD 1430 #define VER_LAMEXP_CONFG 1348 /////////////////////////////////////////////////////////////////////////////// diff --git a/src/Dialog_SplashScreen.cpp b/src/Dialog_SplashScreen.cpp index ab824a5b..901577be 100644 --- a/src/Dialog_SplashScreen.cpp +++ b/src/Dialog_SplashScreen.cpp @@ -34,41 +34,46 @@ #define FADE_DELAY 16 #define OPACITY_DELTA 0.02 -/* It can happen that the QThread has just terminated and already emitted the 'terminated' signal, but did NOT change the 'isRunning' flag to FALSE yet. */ -/* For this reason the macro will first check the 'isRunning' flag. If (and only if) the flag still returns TRUE, we will call the wait() on the thread. */ -#define THREAD_RUNNING(THRD) (((THRD)->isRunning()) ? (!((THRD)->wait(1))) : false) - -#define SET_TASKBAR_STATE(FLAG) do \ +//Setup taskbar indicator +#define SET_TASKBAR_STATE(WIDGET,VAR,FLAG) do \ { \ if(FLAG) \ { \ - if(!bTaskBar) bTaskBar = WinSevenTaskbar::setTaskbarState(splashScreen, WinSevenTaskbar::WinSevenTaskbarIndeterminateState); \ + if(!(VAR)) (VAR) = WinSevenTaskbar::setTaskbarState((WIDGET), WinSevenTaskbar::WinSevenTaskbarIndeterminateState); \ } \ else \ { \ - if(bTaskBar) bTaskBar = (!WinSevenTaskbar::setTaskbarState(splashScreen, WinSevenTaskbar::WinSevenTaskbarNoState)); \ + if((VAR)) (VAR) = (!WinSevenTaskbar::setTaskbarState((WIDGET), WinSevenTaskbar::WinSevenTaskbarNoState)); \ } \ } \ while(0) -#define ASYNC_WAIT(LOOP, DELAY) do \ -{ \ - QTimer::singleShot((DELAY), (LOOP), SLOT(quit())); \ - (LOOP)->exec(QEventLoop::ExcludeUserInputEvents); \ -} \ -while(0) - //////////////////////////////////////////////////////////// // Constructor //////////////////////////////////////////////////////////// SplashScreen::SplashScreen(QWidget *parent) : + m_opacitySteps(qRound(1.0 / OPACITY_DELTA)), QFrame(parent, Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint) { //Init the dialog, from the .ui file setupUi(this); + //Make size fixed + setFixedSize(this->size()); + + //Create event loop + m_loop = new QEventLoop(this); + + //Create timer + m_timer = new QTimer(this); + m_timer->setInterval(FADE_DELAY); + m_timer->setSingleShot(false); + + //Connect timer to slot + connect(m_timer, SIGNAL(timeout()), this, SLOT(updateHandler())); + //Start animation m_working = new QMovie(":/images/Loading.gif"); labelLoading->setMovie(m_working); @@ -77,8 +82,11 @@ SplashScreen::SplashScreen(QWidget *parent) //Set wait cursor setCursor(Qt::WaitCursor); - //Prevent close + //Init status m_canClose = false; + m_status = STATUS_FADE_IN; + m_fadeValue = 0; + m_taskBarInit = false; } //////////////////////////////////////////////////////////// @@ -90,9 +98,11 @@ SplashScreen::~SplashScreen(void) if(m_working) { m_working->stop(); - delete m_working; - m_working = NULL; } + + LAMEXP_DELETE(m_working); + LAMEXP_DELETE(m_loop); + LAMEXP_DELETE(m_timer); } //////////////////////////////////////////////////////////// @@ -101,15 +111,10 @@ SplashScreen::~SplashScreen(void) void SplashScreen::showSplash(QThread *thread) { - const int opacitySteps = qRound(1.0 / OPACITY_DELTA); - bool bTaskBar = false; - unsigned int deadlockCounter = 0; SplashScreen *splashScreen = new SplashScreen(); //Show splash - splashScreen->m_canClose = false; splashScreen->setWindowOpacity(OPACITY_DELTA); - splashScreen->setFixedSize(splashScreen->size()); splashScreen->show(); //Wait for window to show @@ -117,67 +122,85 @@ void SplashScreen::showSplash(QThread *thread) splashScreen->repaint(); QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); - //Setup the event loop - QEventLoop *loop = new QEventLoop(splashScreen); - connect(thread, SIGNAL(terminated()), loop, SLOT(quit()), Qt::QueuedConnection); - connect(thread, SIGNAL(finished()), loop, SLOT(quit()), Qt::QueuedConnection); - - //Create timer - QTimer *timer = new QTimer(); - connect(timer, SIGNAL(timeout()), loop, SLOT(quit())); - - //Start the thread - thread->start(); + //Connect thread signals + connect(thread, SIGNAL(terminated()), splashScreen, SLOT(threadComplete()), Qt::QueuedConnection); + connect(thread, SIGNAL(finished()), splashScreen, SLOT(threadComplete()), Qt::QueuedConnection); //Init taskbar - SET_TASKBAR_STATE(true); + SET_TASKBAR_STATE(splashScreen, splashScreen->m_taskBarInit, true); - //Fade in - for(int i = 1; i <= opacitySteps; i++) + //Start the thread + splashScreen->m_timer->start(FADE_DELAY); + QTimer::singleShot(3*60*1000, splashScreen->m_loop, SLOT(quit())); + QTimer::singleShot(0, thread, SLOT(start())); + + //Start event handling! + const int ret = splashScreen->m_loop->exec(QEventLoop::ExcludeUserInputEvents); + + //Check for timeout + if(ret != 42) { - const double opacity = (i < opacitySteps) ? (OPACITY_DELTA * static_cast(i)) : 1.0; - splashScreen->setWindowOpacity(opacity); //splashScreen->update(); - ASYNC_WAIT(loop, FADE_DELAY); - SET_TASKBAR_STATE(true); - } - - //Start the timer - timer->start(30720); - - //Loop while thread is still running - while(THREAD_RUNNING(thread)) - { - if((++deadlockCounter) > 60) - { - qFatal("Deadlock in initialization thread detected!"); - } - ASYNC_WAIT(loop, 5000); - } - - //Stop the timer - timer->stop(); - - //Fade out - for(int i = opacitySteps; i >= 0; i--) - { - const double opacity = OPACITY_DELTA * static_cast(i); - splashScreen->setWindowOpacity(opacity); //splashScreen->update(); - ASYNC_WAIT(loop, FADE_DELAY); + thread->terminate(); + qFatal("Deadlock in initialization thread encountered!"); } //Restore taskbar - SET_TASKBAR_STATE(false); + SET_TASKBAR_STATE(splashScreen, splashScreen->m_taskBarInit, false); //Hide splash splashScreen->m_canClose = true; splashScreen->close(); //Free - LAMEXP_DELETE(loop); - LAMEXP_DELETE(timer); LAMEXP_DELETE(splashScreen); } +//////////////////////////////////////////////////////////// +// SLOTS +//////////////////////////////////////////////////////////// + +void SplashScreen::updateHandler(void) +{ + if(m_status == STATUS_FADE_IN) + { + if(m_fadeValue < m_opacitySteps) + { + setWindowOpacity(OPACITY_DELTA * static_cast(++m_fadeValue)); + SET_TASKBAR_STATE(this, m_taskBarInit, true); + } + else + { + setWindowOpacity(1.0); + m_timer->stop(); + m_status = STATUS_WAIT; + } + } + else if(m_status == STATUS_FADE_OUT) + { + if(m_fadeValue > 0) + { + setWindowOpacity(OPACITY_DELTA * static_cast(--m_fadeValue)); + SET_TASKBAR_STATE(this, m_taskBarInit, true); + } + else + { + setWindowOpacity(0.0); + m_timer->stop(); + m_status = STATUS_DONE; + m_loop->exit(42); + } + } +} + +void SplashScreen::threadComplete(void) +{ + m_status = STATUS_FADE_OUT; + if(!m_timer->isActive()) + { + m_timer->start(FADE_DELAY); + } +} + //////////////////////////////////////////////////////////// // EVENTS //////////////////////////////////////////////////////////// diff --git a/src/Dialog_SplashScreen.h b/src/Dialog_SplashScreen.h index 3cabdd55..ddabb485 100644 --- a/src/Dialog_SplashScreen.h +++ b/src/Dialog_SplashScreen.h @@ -33,14 +33,36 @@ class SplashScreen: public QFrame, private Ui::SplashScreen Q_OBJECT public: - SplashScreen(QWidget *parent = 0); - ~SplashScreen(void); - static void showSplash(QThread *thread); private: + SplashScreen(QWidget *parent = 0); + ~SplashScreen(void); + + enum + { + STATUS_FADE_IN = 0, + STATUS_WAIT = 1, + STATUS_FADE_OUT = 2, + STATUS_DONE = 3 + } + status_t; + QMovie *m_working; - bool m_canClose; + QEventLoop *m_loop; + QTimer *m_timer; + + const unsigned int m_opacitySteps; + + unsigned int m_status; + unsigned int m_fadeValue; + + volatile bool m_canClose; + volatile bool m_taskBarInit; + +private slots: + void updateHandler(void); + void threadComplete(void); protected: void keyPressEvent(QKeyEvent *event);