#2939 ProgressInfo: Reintroduce process envents, to update the progress dialog durig processing on linux/mac.

Introduced isActive and used this info to block sheduled redraw/display model regen when progress bar is active, to avoid unintended recursive behaviour resulting in crashes.
This commit is contained in:
Jacob Støren
2018-05-21 23:46:35 +02:00
parent 2e9341c6d1
commit 9b9f9b2bf1
7 changed files with 106 additions and 19 deletions

View File

@@ -37,6 +37,7 @@
#include "cafProgressInfo.h"
#include "cafAssert.h"
#include "cafProgressState.h"
#include <QPointer>
#include <QProgressDialog>
@@ -317,6 +318,13 @@ namespace caf {
return progressDialog()->thread() == QThread::currentThread();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool ProgressState::isActive()
{
return !maxProgressStack().empty();
}
//--------------------------------------------------------------------------------------------------
///
@@ -426,8 +434,8 @@ namespace caf {
progressDialog()->setValue(static_cast<int>(currentTotalProgress()));
progressDialog()->setLabelText(currentComposedLabel());
//QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
if (progressDialog()) progressDialog()->repaint();
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
//if (progressDialog()) progressDialog()->repaint();
}
@@ -441,8 +449,8 @@ namespace caf {
descriptionStack().back() = description;
progressDialog()->setLabelText(currentComposedLabel());
//QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
if (progressDialog()) progressDialog()->repaint();
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
//if (progressDialog()) progressDialog()->repaint();
}
@@ -483,8 +491,8 @@ namespace caf {
progressDialog()->setMaximum(totalMaxProgress);
progressDialog()->setValue(totalProgress);
//QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
if (progressDialog()) progressDialog()->repaint();
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
//if (progressDialog()) progressDialog()->repaint();
}
@@ -560,7 +568,7 @@ namespace caf {
progressDialog()->setLabelText(currentComposedLabel());
// If we are finishing the last level, clean up
if (!maxProgressStack_v.size())
if (maxProgressStack_v.empty())
{
if (progressDialog() != nullptr)
{
@@ -568,11 +576,12 @@ namespace caf {
progressDialog()->close();
}
}
// Make sure the Gui is repainted
//QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
if (progressDialog()) progressDialog()->repaint();
else
{
// Make sure the Gui is repainted
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
//if (progressDialog()) progressDialog()->repaint();
}
}

View File

@@ -0,0 +1,45 @@
//##################################################################################################
//
// Custom Visualization Core library
// Copyright (C) 2011-2013 Ceetron AS
//
// This library may be used under the terms of either the GNU General Public License or
// the GNU Lesser General Public License as follows:
//
// GNU General Public License Usage
// This library is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <<http://www.gnu.org/licenses/gpl.html>>
// for more details.
//
// GNU Lesser General Public License Usage
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU Lesser General Public License at <<http://www.gnu.org/licenses/lgpl-2.1.html>>
// for more details.
//
//##################################################################################################
namespace caf {
class ProgressState
{
public:
static bool isActive();
};
}