GUIInvoke takes a QObject* to avoid callbacks after object lifetime

* The GUIInvoke object takes a QObject, and uses QPointer to check that
  it hasn't been deleted when the callback fires. This prevents delayed
  callbacks from executing after the object has been deleted and
  crashing.
* In most cases the pointer is just 'this'.
This commit is contained in:
baldurk
2018-05-08 11:54:34 +01:00
parent c880def5ef
commit 082ab4d75d
25 changed files with 113 additions and 108 deletions
+3 -3
View File
@@ -218,7 +218,7 @@ void ResourceInspector::Inspect(ResourceId id)
rdcarray<ShaderEntryPoint> entries = r->GetShaderEntryPoints(id);
GUIInvoke::call([this, entries, usage] {
GUIInvoke::call(this, [this, entries, usage] {
if(!entries.isEmpty())
{
@@ -450,13 +450,13 @@ void ResourceInspector::on_viewContents_clicked()
ResourceId id = m_Resource;
ICaptureContext *ctx = &m_Ctx;
m_Ctx.Replay().AsyncInvoke([ctx, id, entry](IReplayController *r) {
m_Ctx.Replay().AsyncInvoke([this, ctx, id, entry](IReplayController *r) {
ShaderReflection *refl = r->GetShader(id, entry);
if(!refl)
return;
GUIInvoke::call([ctx, refl] {
GUIInvoke::call(this, [ctx, refl] {
IShaderViewer *viewer = ctx->ViewShader(refl, ResourceId());
ctx->AddDockWindow(viewer->Widget(), DockReference::MainToolArea, NULL);