From d50c44815167216ba99ea9743c4bafe48893e4af Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 22 Jun 2017 19:15:58 -0700 Subject: [PATCH] Fix heap corruption coming out of running scripts dialog --- .../qml/hifi/dialogs/RunningScripts.qml | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/hifi/dialogs/RunningScripts.qml b/interface/resources/qml/hifi/dialogs/RunningScripts.qml index b8ba66b73f..da9ffdb07e 100644 --- a/interface/resources/qml/hifi/dialogs/RunningScripts.qml +++ b/interface/resources/qml/hifi/dialogs/RunningScripts.qml @@ -39,10 +39,26 @@ ScrollingWindow { property alias x: root.x property alias y: root.y } + + Timer { + id: refreshTimer + interval: 100 + repeat: false + running: false + onTriggered: updateRunningScripts(); + } + + Component { + id: listModelBuilder + ListModel { } + } Connections { target: ScriptDiscoveryService - onScriptCountChanged: updateRunningScripts(); + onScriptCountChanged: { + runningScriptsModel = listModelBuilder.createObject(root); + refreshTimer.restart(); + } } Component.onCompleted: { @@ -65,10 +81,16 @@ ScrollingWindow { b = simplify(b.path); return a < b ? -1 : a > b ? 1 : 0; }); - runningScriptsModel.clear() + // Calling `runningScriptsModel.clear()` here instead of creating a new object + // triggers some kind of weird heap corruption deep inside Qt. So instead of + // modifying the model in place, possibly triggering behaviors in the table + // instead we create a new `ListModel`, populate it and update the + // existing model atomically. + var newRunningScriptsModel = listModelBuilder.createObject(root); for (var i = 0; i < runningScripts.length; ++i) { - runningScriptsModel.append(runningScripts[i]); + newRunningScriptsModel.append(runningScripts[i]); } + runningScriptsModel = newRunningScriptsModel; } function loadScript(script) {