Postpone error message display if not in GUI thread

Calls to report_error() crashed if not called from GUI thread.
Fix this by postponing error message display if not in GUI thread.
Code that creates a thread which possibly calls report_error()
is responsible for calling MainWindow::showErrors() to flush
the accumulated messages.

Note that there is a race condition in report_error() and
get_error_string(). Nevertheless, hitting it should be rather
unlikely (two threads producing error messages at the same time)
and hopefully it can be fixed rather easily.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2017-10-31 21:28:59 +01:00 committed by Dirk Hohndel
parent 945a0a8748
commit 3acc28cebf
3 changed files with 21 additions and 3 deletions

View file

@ -220,6 +220,10 @@ void DownloadFromDCWidget::updateState(states state)
// got an error // got an error
else if (state == ERROR) { else if (state == ERROR) {
timer->stop(); timer->stop();
// Show messages that worker thread produced.
MainWindow::instance()->showErrors();
QMessageBox::critical(this, TITLE_OR_TEXT(tr("Error"), thread.error), QMessageBox::Ok); QMessageBox::critical(this, TITLE_OR_TEXT(tr("Error"), thread.error), QMessageBox::Ok);
markChildrenAsEnabled(); markChildrenAsEnabled();
progress_bar_text = ""; progress_bar_text = "";

View file

@ -88,12 +88,22 @@ MainWindow *MainWindow::m_Instance = NULL;
extern "C" void showErrorFromC() extern "C" void showErrorFromC()
{ {
// Show errors only if we are running in the GUI thread.
// If we're not in the GUI thread, let errors accumulate.
if (QThread::currentThread() != QCoreApplication::instance()->thread())
return;
MainWindow *mainwindow = MainWindow::instance(); MainWindow *mainwindow = MainWindow::instance();
if (mainwindow) { if (mainwindow)
mainwindow->getNotificationWidget()->showNotification(get_error_string(), KMessageWidget::Error); mainwindow->showErrors();
}
} }
void MainWindow::showErrors()
{
const char *error = get_error_string();
if (error && error[0])
getNotificationWidget()->showNotification(error, KMessageWidget::Error);
}
MainWindow::MainWindow() : QMainWindow(), MainWindow::MainWindow() : QMainWindow(),
actionNextDive(0), actionNextDive(0),

View file

@ -89,6 +89,10 @@ public:
void enableDisableCloudActions(); void enableDisableCloudActions();
void setCheckedActionFilterTags(bool checked); void setCheckedActionFilterTags(bool checked);
// Shows errors that have accumulated.
// Must be called from GUI thread.
void showErrors();
private private
slots: slots:
/* file menu action */ /* file menu action */