Guarding QTimer::singelShot operations, avoid to access dangling pointers

This commit is contained in:
Klaus Basan
2018-04-14 23:16:55 +02:00
committed by Roland Winklmeier
parent b5ba4013dd
commit 1b8383bee1
10 changed files with 52 additions and 8 deletions

View File

@@ -119,8 +119,10 @@ namespace BlackCore
if (m_network && sApp && !sApp->isShuttingDown())
{
// thread safe update of m_network
const QPointer<CAirspaceMonitor> guard(this);
QTimer::singleShot(0, m_network, [ = ]
{
if (guard.isNull()) { return; }
if (m_network) { m_network->addInterimPositionReceiver(callsign); }
});
}
@@ -459,8 +461,10 @@ namespace BlackCore
if (trial < 2 && !complete)
{
this->addReverseLookupMessage(callsign, "Wait for further data");
const QPointer<CAirspaceMonitor> guard(this);
QTimer::singleShot(1500, this, [ = ]()
{
if (guard.isNull()) { return; }
this->sendReadyForModelMatching(callsign, trial + 1); // recursive
});
return;

View File

@@ -1179,7 +1179,12 @@ namespace BlackCore
// and trigger read
if (sApp->isInternetAccessible())
{
QTimer::singleShot(0, m_sharedInfoDataReader, [this]() { m_sharedInfoDataReader->read(); });
const QPointer<CWebDataServices> guard(this);
QTimer::singleShot(0, m_sharedInfoDataReader, [ = ]()
{
if (guard.isNull()) { return; }
m_sharedInfoDataReader->read();
});
}
else
{

View File

@@ -69,7 +69,12 @@ namespace BlackGui
bool CConfigurationWizard::event(QEvent *event)
{
if (event->type() != QEvent::EnterWhatsThisMode) { return QDialog::event(event); }
QTimer::singleShot(0, this, [ = ] { sGui->showHelp(this); });
const QPointer<CConfigurationWizard> guard(this);
QTimer::singleShot(0, this, [ = ]
{
if (guard.isNull() || !sGui || sGui->isShuttingDown()) { return; }
sGui->showHelp(this);
});
return true;
}

View File

@@ -87,9 +87,10 @@ namespace BlackGui
{
ui->comp_SimulatorSelector->setValue(simulator);
ui->le_Simulator->setText(simulator.toQString(true));
QTimer::singleShot(500, [this]()
const QPointer<CDbOwnModelSetComponent> guard(this);
QTimer::singleShot(500, [ = ]()
{
if (!sApp || sApp->isShuttingDown()) { return; }
if (guard.isNull() || !sApp || sApp->isShuttingDown()) { return; }
this->updateViewToCurrentModels();
});
}

View File

@@ -50,7 +50,12 @@ namespace BlackGui
void CDownloadDialog::showAndStartDownloading()
{
QTimer::singleShot(0, this, [ = ] { ui->comp_Download->triggerDownloadingOfFiles(2500); });
const QPointer<CDownloadDialog> guard(this);
QTimer::singleShot(0, this, [ = ]
{
if (guard.isNull()) { return; }
ui->comp_Download->triggerDownloadingOfFiles(2500);
});
this->show();
}

View File

@@ -659,8 +659,10 @@ namespace BlackGui
{
if (ui->cb_Heavy->isChecked())
{
const QPointer<CFlightPlanComponent> guard(this);
QTimer::singleShot(10, this, [ = ]
{
if (guard.isNull()) { return; }
ui->cb_Tcas->setChecked(false);
this->buildPrefixIcaoSuffix();
});
@@ -671,8 +673,10 @@ namespace BlackGui
{
if (ui->cb_Tcas->isChecked())
{
const QPointer<CFlightPlanComponent> guard(this);
QTimer::singleShot(10, this, [ = ]
{
if (guard.isNull()) { return; }
ui->cb_Heavy->setChecked(false);
this->buildPrefixIcaoSuffix();
});

View File

@@ -218,7 +218,12 @@ namespace BlackGui
if (reply == QMessageBox::Yes)
{
const CStatusMessage msg = CStatusMessage(this).info("Using existing file '%1'") << saveAsFile;
QTimer::singleShot(100, this, [ = ] { this->downloadedXSwiftBusFile(msg); });
const QPointer<CInstallXSwiftBusComponent> guard(this);
QTimer::singleShot(100, this, [ = ]
{
if (guard.isNull()) { return; }
this->downloadedXSwiftBusFile(msg);
});
return;
}
}

View File

@@ -508,7 +508,12 @@ namespace BlackGui
// call this deferred, otherwise the values are overridden with any values
// from the UI builder
QTimer::singleShot(500, this, &CViewBaseNonTemplate::settingsChanged);
const QPointer<CViewBaseNonTemplate> guard(this);
QTimer::singleShot(500, this, [ = ]()
{
if (guard.isNull()) { return; }
CViewBaseNonTemplate::settingsChanged();
});
}
QString CViewBaseNonTemplate::getSettingsFileName(bool load) const

View File

@@ -59,8 +59,10 @@ namespace BlackSimPlugin
bool CSimulatorEmulated::connectTo()
{
const QPointer<CSimulatorEmulated> guard(this);
QTimer::singleShot(1000, this, [ = ]
{
if (guard.isNull()) { return; }
this->emitSimulatorCombinedStatus();
m_monitorWidget->show();
});
@@ -439,8 +441,10 @@ namespace BlackSimPlugin
void CSimulatorEmulatedListener::startImpl()
{
if (this->isShuttingDown()) { return; }
const QPointer<CSimulatorEmulatedListener> guard(this);
QTimer::singleShot(2000, this, [ = ]
{
if (guard.isNull()) { return; }
Q_ASSERT_X(this->getPluginInfo().isValid(), Q_FUNC_INFO, "Invalid plugin");
emit this->simulatorStarted(this->getPluginInfo());
});

View File

@@ -25,6 +25,7 @@
#include "blackconfig/buildconfig.h"
#include <QTimer>
#include <QPointer>
#include <type_traits>
using namespace BlackConfig;
@@ -1004,7 +1005,12 @@ namespace BlackSimPlugin
}
// cleanup function, actually this should not be needed
QTimer::singleShot(100, this, &CSimulatorFsxCommon::physicallyRemoveAircraftNotInProvider);
const QPointer<CSimulatorFsxCommon> guard(this);
QTimer::singleShot(100, this, [ = ]
{
if (guard.isNull()) { return; }
CSimulatorFsxCommon::physicallyRemoveAircraftNotInProvider();
});
// bye
return true;