代码之家  ›  专栏  ›  技术社区  ›  Sturm

在两个lambda之间共享对象

  •  1
  • Sturm  · 技术社区  · 6 年前

    我正在尝试使用shared\u 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);
            }
        });
    

    如您所见,我正在尝试使用StartAsync函数通知文件夹中是否出现了文件,该函数接受2个lambda(该函数基本上创建qobject并将它们移动到后台线程,然后在信号和插槽之间建立一些连接)。

    编辑:

    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();
    }
    

    如有任何建议,我们将不胜感激。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Dmitry Gordon    6 年前

    std::shared_ptr

    fileToLoad = make_shared<string>(files.first().toUtf8().constData());
    

    *fileToLoad  = files.first().toUtf8().constData()
    

    (当然要事先检查fileToLoad是否为空)

        2
  •  0
  •   bartop    6 年前

    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);
            }
        });