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

时间:2013-12-02 15:25:26

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

虽然这有效,但我有这种奇怪的感觉,我的QObject发出的并不是线程安全的,事实上它还没有爆炸,只是运气。

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的引用会导致问题吗?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

只要与插槽的连接不是QT::DirectConnectionQT::BlockingQueuedConnection where there may be issues with different threads

发出就是线程安全的 默认情况下,

connect使用Qt::AutoConnection,无论发出哪个线程,都会确保采取正确的操作