c++ - 在两个 lambda 之间共享对象

标签 c++ lambda shared-ptr

我正在尝试使用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/

相关文章:

c++ - 在c++中将句子作为输入

C++:避免​​继承层次结构中的双重维护

c++ - "could not convert template argument"为其自己的类型

python - Python 中的条件全局 Lambda

java - 是否在 lambda 表达式中实例化了一个类?

c++ - Lambda 表达式、共享指针和 this 的类型

c++ - 维护一个 std::set<boost::shared_ptr>

c++ - 二叉树旋转

C++ lambda 值无法捕获

c++ - boost 的 shared_ptr(shared_ptr<Y> const & r, T * p) 是做什么用的?