我正在尝试使用shared_ptr在lambda之间共享相同的对象(在我的例子中是一个字符串):
auto fileToLoad = make_shared<string>();
StartAsync(
[=]()
{
QDir dir(dirPath.c_str());
QString fileExtension(fileExt.c_str());
for (int i = 0; i < 150; i++)
{
auto files = dir.entryList(QStringList() << fileExtension << fileExtension.toUpper(), QDir::Files);
if (!files.empty())
{
//fileToLoad.reset(new string(files.first().toUtf8().constData()));
fileToLoad = make_shared<string>(files.first().toUtf8().constData());
break;
}
this_thread::sleep_for(chrono::milliseconds(200));
}
},
[=]()
{
if (fileToLoad == nullptr)
{
DisplayMessage("Timeout reached");
}
else
{
doFunc(*fileToLoad);
}
});
经过多次尝试,我仍然无法使其按我想要的方式工作:将 fileToLoad 存储在第一个 lambda 中并在第二个 lambda 中使用它。或者由于限定符(const)而无法编译,或者可以编译但“fileToLoad”仍为空。
正如你所看到的,我试图使用 StartAsync 函数来通知文件夹中是否出现了文件,该函数需要 2 个 lambda(该函数基本上创建 QObjects 并将它们移动到后台线程,然后在信号和插槽之间建立一些连接)。编辑:
StartAsync:采用任务的 lambda(冗长的工作)和后任务的 lambda(UI 更新)
void MainWidget::StartAsync(function<void()> func, function<void()> postTask)
{
AsyncTask* task = new AsyncTask(func, [=]() { if (postTask != nullptr) { postTask(); HideProgressBar(); }});
QThread* thread = new QThread();
task->moveToThread(thread);
connect(thread, &QThread::started, this, &MainWidget::ShowProgressBar);
connect(thread, &QThread::started, task, &AsyncTask::RunTask);
connect(task, &AsyncTask::TaskFinished, task, &AsyncTask::RunPostTask);
connect(thread, &QThread::finished, task, &QObject::deleteLater);
connect(thread, &QThread::finished, thread, &QObject::deleteLater);
thread->start();
}
如有任何建议,我们将不胜感激。
最佳答案
当您将新值分配给 std::shared_ptr
时 - 您创建了一个新的共享值,该值与前一个值没有任何联系(您可以查看以下计数器)都是shared_ptr)。你应该改变
fileToLoad = make_shared<string>(files.first().toUtf8().constData());
到
*fileToLoad = files.first().toUtf8().constData()
(当然事先检查 fileToLoad 不为空)
关于c++ - 在两个 lambda 之间共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55607954/