Some improvements in Splash Screen (application initialization) code.

This commit is contained in:
LoRd_MuldeR 2013-10-20 23:36:53 +02:00
parent 3d7fbf70f5
commit bb687bdc45
3 changed files with 23 additions and 25 deletions

View File

@ -21,6 +21,7 @@ a:visited { color: #0000EE; }
<li>Upgraded build environment to Microsoft Visual Studio 2013 RTM <li>Upgraded build environment to Microsoft Visual Studio 2013 RTM
<li>Improved internal encoder API, so each encoder can define its own configuration options <li>Improved internal encoder API, so each encoder can define its own configuration options
<li>Complete overhaul of the file analyzer, resulting in up to 2.5x faster file import speed <li>Complete overhaul of the file analyzer, resulting in up to 2.5x faster file import speed
<li>Reworked the application initialization code, resulting in somehwat faster startup speed
<li>Updated mpg123 decoder to v1.16.0 (2013-10-06), compiled with GCC 4.8.1 <li>Updated mpg123 decoder to v1.16.0 (2013-10-06), compiled with GCC 4.8.1
<li>Updated GnuPG to v1.4.15 (2013-10-05), compiled with GCC 4.8.1 <li>Updated GnuPG to v1.4.15 (2013-10-05), compiled with GCC 4.8.1
<li>Various bugfixes and code improvements <li>Various bugfixes and code improvements

View File

@ -34,7 +34,7 @@
#define VER_LAMEXP_MINOR_LO 9 #define VER_LAMEXP_MINOR_LO 9
#define VER_LAMEXP_TYPE Alpha #define VER_LAMEXP_TYPE Alpha
#define VER_LAMEXP_PATCH 3 #define VER_LAMEXP_PATCH 3
#define VER_LAMEXP_BUILD 1407 #define VER_LAMEXP_BUILD 1410
#define VER_LAMEXP_CONFG 1348 #define VER_LAMEXP_CONFG 1348
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -34,9 +34,8 @@
#define OPACITY_DELTA 0.02 #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. */ /* 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, then we will wait() for at most 50 ms. */ /* 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. */
/* If, after 50 ms, the wait() function returns with FALSE, then the thread probably is still running and we return TRUE. Otherwise we can return FALSE. */ #define THREAD_RUNNING(THRD) (((THRD)->isRunning()) ? (!((THRD)->wait(1))) : false)
#define THREAD_RUNNING(THRD) (((THRD)->isRunning()) ? (!((THRD)->wait(50))) : false)
#define SET_TASKBAR_STATE(FLAG) do \ #define SET_TASKBAR_STATE(FLAG) do \
{ \ { \
@ -51,6 +50,13 @@
} \ } \
while(0) while(0)
#define ASYNC_WAIT(LOOP, DELAY) do \
{ \
QTimer::singleShot((DELAY), (LOOP), SLOT(quit())); \
(LOOP)->exec(QEventLoop::ExcludeUserInputEvents); \
} \
while(0)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// Constructor // Constructor
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
@ -94,14 +100,14 @@ SplashScreen::~SplashScreen(void)
void SplashScreen::showSplash(QThread *thread) void SplashScreen::showSplash(QThread *thread)
{ {
double opacity = OPACITY_DELTA;
const int opacitySteps = qRound(1.0 / OPACITY_DELTA); const int opacitySteps = qRound(1.0 / OPACITY_DELTA);
SplashScreen *splashScreen = new SplashScreen();
bool bTaskBar = false; bool bTaskBar = false;
unsigned int deadlockCounter = 0;
SplashScreen *splashScreen = new SplashScreen();
//Show splash //Show splash
splashScreen->m_canClose = false; splashScreen->m_canClose = false;
splashScreen->setWindowOpacity(opacity); splashScreen->setWindowOpacity(OPACITY_DELTA);
splashScreen->setFixedSize(splashScreen->size()); splashScreen->setFixedSize(splashScreen->size());
splashScreen->show(); splashScreen->show();
@ -119,10 +125,8 @@ void SplashScreen::showSplash(QThread *thread)
QTimer *timer = new QTimer(); QTimer *timer = new QTimer();
connect(timer, SIGNAL(timeout()), loop, SLOT(quit())); connect(timer, SIGNAL(timeout()), loop, SLOT(quit()));
//Start thread //Start the thread
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
thread->start(); thread->start();
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
//Init taskbar //Init taskbar
SET_TASKBAR_STATE(true); SET_TASKBAR_STATE(true);
@ -130,29 +134,23 @@ void SplashScreen::showSplash(QThread *thread)
//Fade in //Fade in
for(int i = 1; i <= opacitySteps; i++) for(int i = 1; i <= opacitySteps; i++)
{ {
opacity = (i < opacitySteps) ? (OPACITY_DELTA * static_cast<double>(i)) : 1.0; const double opacity = (i < opacitySteps) ? (OPACITY_DELTA * static_cast<double>(i)) : 1.0;
splashScreen->setWindowOpacity(opacity); splashScreen->setWindowOpacity(opacity);
splashScreen->update(); splashScreen->update();
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents, FADE_DELAY); ASYNC_WAIT(loop, FADE_DELAY);
SET_TASKBAR_STATE(true); SET_TASKBAR_STATE(true);
lamexp_sleep(FADE_DELAY);
} }
//Start the timer //Start the timer
timer->start(30720); timer->start(30720);
//Loop while thread is still running //Loop while thread is still running
if(bool bIsRunning = THREAD_RUNNING(thread)) while(THREAD_RUNNING(thread))
{ {
int deadlockCounter = 0; ASYNC_WAIT(loop, 500);
while(bIsRunning) if((deadlockCounter++ > 360) && thread->isRunning())
{ {
loop->exec(); qFatal("Deadlock in initialization thread detected!");
if(bIsRunning = THREAD_RUNNING(thread))
{
qWarning("Potential deadlock in initialization thread!");
if(++deadlockCounter >= 10) qFatal("Deadlock in initialization thread!");
}
} }
} }
@ -162,11 +160,10 @@ void SplashScreen::showSplash(QThread *thread)
//Fade out //Fade out
for(int i = opacitySteps; i >= 0; i--) for(int i = opacitySteps; i >= 0; i--)
{ {
opacity = OPACITY_DELTA * static_cast<double>(i); const double opacity = OPACITY_DELTA * static_cast<double>(i);
splashScreen->setWindowOpacity(opacity); splashScreen->setWindowOpacity(opacity);
splashScreen->update(); splashScreen->update();
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents, FADE_DELAY); ASYNC_WAIT(loop, FADE_DELAY);
lamexp_sleep(FADE_DELAY);
} }
//Restore taskbar //Restore taskbar