From 3f5bf7c0810ea43c915eb9d778eb44d0bb94c396 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Mon, 4 Nov 2019 10:56:00 +0800 Subject: [PATCH] fix: extend the lifespan of captured objects. --- gio-qt/source/dgiofile.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/gio-qt/source/dgiofile.cpp b/gio-qt/source/dgiofile.cpp index 3ab32e4..f51dd7c 100644 --- a/gio-qt/source/dgiofile.cpp +++ b/gio-qt/source/dgiofile.cpp @@ -235,24 +235,27 @@ QExplicitlySharedDataPointer DGioFile::createFileInfo(QString attr unsigned int flagValue = queryInfoFlags; FileQueryInfoFlags flags = static_cast(flagValue); Glib::RefPtr gmmFileInfo; - QWaitCondition cond; - QtConcurrent::run([&] { + QSharedPointer cond(new QWaitCondition); + QSharedPointer m(new QMutex); + QtConcurrent::run([&, cond, m, timeout_msec] { + Glib::RefPtr localret; QTime t; t.start(); try { - gmmFileInfo = d->getGmmFileInstance()->query_info(attr.toStdString(), flags); + localret = d->getGmmFileInstance()->query_info(attr.toStdString(), flags); } catch (const Glib::Error &error) { qDebug() << QString::fromStdString(error.what().raw()); + return; } if (t.elapsed() < timeout_msec) { - cond.wakeAll(); + gmmFileInfo = localret; + cond->wakeAll(); } }); - QMutex m; - m.lock(); - bool finished = gmmFileInfo || cond.wait(&m, timeout_msec); - m.unlock(); + m->lock(); + bool finished = gmmFileInfo || cond->wait(m.data(), timeout_msec); + m->unlock(); if (finished && gmmFileInfo) { QExplicitlySharedDataPointer fileInfoPtr(new DGioFileInfo(gmmFileInfo.release())); return fileInfoPtr;