c++ - QtConcurrent.run() 带有 c++11 lambda,捕获对 "this"的引用以发出信号

标签 c++ qt c++11 lambda qtconcurrent

虽然这行得通,但我有一种奇怪的感觉,我的 QObject emit 不是线程安全的,事实上它还没有爆炸只是运气。

void LoginController::attemptLogin(QString username, QString password)
{
    emit loginAttemptStatus(QString("Connecting to service..."));
    QFuture<bool> future = QtConcurrent::run([&](QString username, QString password){
            // fake a long running operation
            QThread::sleep(1);
            emit loginAttemptStatus(QString("Connected to service..."));
            // a dumb test login
            QString u("asdf");
            bool success = username.compare( u ) == 0;
            if ( success ) {
                emit loginAttemptStatus(QString("Success..."));
            } else {
                emit loginAttemptStatus(QString("Failure..."));
            }
            return success;
    }, username, password);
    this->watchLoginAttempt.setFuture(future);
}

那么,捕获对 this 的引用会导致问题吗?

因为我认为是,但我找不到确定的答案。

最佳答案

唯一可能爆炸的情况是在 lambda 表达式结束之前销毁 LoginController。正确处理 watchLoginAttempt(future)应该可以防止这种情况发生。

关于c++ - QtConcurrent.run() 带有 c++11 lambda,捕获对 "this"的引用以发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20331792/

相关文章:

c++ - 有没有办法让两个不同大小的变量共享一个内存地址而不用将它们声明为指针?

ios - 为 iOS 编译 Qt(UIKit 灯塔)第 2 部分

c++ - 在 qt/kdelibs 应用程序上显示后更改终端界面命令

c++ - 在类内部引入的类名不被视为嵌套类名

C++ 和 C++11 类静态成员,double 应该使用 "constexpr"而 int 可以是 "const",为什么?

c++ - 你如何将 c++filt 与 llvm-cov 报告一起使用?

c++ - 使用 std::list 提高简单性

c++ - 使用基类实例创建派生类实例

css - QMessageBoxes 在 OSX 中有非常奇怪的行为

c++ - getline 的替代品