我试图使用shared_ptr在lambdas之间共享相同的对象(在我的情况下,一个字符串):
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个lambdas(此函数基本上创建QObject并将它们移动到后台线程,然后在信号和插槽之间建立一些连接)。
编辑:
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();
}
任何建议表示赞赏。
当您为std::shared_ptr
分配新值时 - 您创建一个新的共享值,该值与前一个没有任何连接(您可以查看两个shared_ptrs的计数器)。你应该改变
fileToLoad = make_shared<string>(files.first().toUtf8().constData());
至
*fileToLoad = files.first().toUtf8().constData()
(当然事先检查fileToLoad是否为null)
你的代码不起作用,因为在第一个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);
}
});