虽然这有效,但我有这种奇怪的感觉,我的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
的引用会导致问题吗?
因为我认为是,但我找不到明确的答案。
答案 0 :(得分:1)
唯一可以爆炸的情况是,在lambda表达式结束之前销毁LoginController
。正确处理watchLoginAttempt
(future
)可以防止这种情况发生。
答案 1 :(得分:0)
QT::DirectConnection
或QT::BlockingQueuedConnection
where there may be issues with different threads ,发出就是线程安全的 默认情况下,
connect
使用Qt::AutoConnection
,无论发出哪个线程,都会确保采取正确的操作