Хотя это работает, у меня возникает странное ощущение, что мой 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
собирается вызвать проблемы?
Потому что я думаю, что это так, но я не могу найти окончательный ответ.
Единственный случай, когда он может взорваться, это когда ты уничтожаешь LoginController
до окончания лямбда-выражения. Правильное обращение с watchLoginAttempt
(future
) должен предотвратить это.
испускание является потокобезопасным, пока соединения с гнездами не QT::DirectConnection
или же QT::BlockingQueuedConnection
где могут быть проблемы с разными потоками
connect
использования Qt::AutoConnection
по умолчанию, которые обеспечивают правильное действие независимо от того, какая нить выполняет