在两个 lambda 之间共享对象
Share object between two lambdas
我正在尝试使用 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 中并在第二个中使用它。或者它由于限定符 (const) 而无法编译,或者它编译但 'fileToLoad' 仍然为空。
如您所见,我正在尝试使用 StartAsync 函数通知文件夹中是否出现文件,该函数需要 2 个 lambda(此函数基本上创建 QObjects 并将它们移动到后台线程,然后在信号之间建立一些连接和插槽)。
编辑:
StartAsync:获取任务的 lambda(冗长的工作)和 post 任务的 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();
}
如有任何建议,我们将不胜感激。
您的代码将无法运行,因为在第一个 lambda 中您覆盖了 lambda 中的临时指针。您可以做的是覆盖指针后面的 std::string
,它应该可以正常工作:
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 = files.first().toStdString();
break;
}
this_thread::sleep_for(chrono::milliseconds(200));
}
},
[=]()
{
if (fileToLoad == nullptr)
{
DisplayMessage("Timeout reached");
}
else
{
doFunc(*fileToLoad);
}
});
当您为 std::shared_ptr
分配一个新值时 - 您创建了一个新的共享值,它与前一个值没有任何联系(您可以查看两者的计数器 shared_ptrs).你应该改变
fileToLoad = make_shared<string>(files.first().toUtf8().constData());
到
*fileToLoad = files.first().toUtf8().constData()
(当然要事先检查 fileToLoad 不为空)
我正在尝试使用 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 中并在第二个中使用它。或者它由于限定符 (const) 而无法编译,或者它编译但 'fileToLoad' 仍然为空。
如您所见,我正在尝试使用 StartAsync 函数通知文件夹中是否出现文件,该函数需要 2 个 lambda(此函数基本上创建 QObjects 并将它们移动到后台线程,然后在信号之间建立一些连接和插槽)。
编辑:
StartAsync:获取任务的 lambda(冗长的工作)和 post 任务的 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();
}
如有任何建议,我们将不胜感激。
您的代码将无法运行,因为在第一个 lambda 中您覆盖了 lambda 中的临时指针。您可以做的是覆盖指针后面的 std::string
,它应该可以正常工作:
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 = files.first().toStdString();
break;
}
this_thread::sleep_for(chrono::milliseconds(200));
}
},
[=]()
{
if (fileToLoad == nullptr)
{
DisplayMessage("Timeout reached");
}
else
{
doFunc(*fileToLoad);
}
});
当您为 std::shared_ptr
分配一个新值时 - 您创建了一个新的共享值,它与前一个值没有任何联系(您可以查看两者的计数器 shared_ptrs).你应该改变
fileToLoad = make_shared<string>(files.first().toUtf8().constData());
到
*fileToLoad = files.first().toUtf8().constData()
(当然要事先检查 fileToLoad 不为空)