@Mercury13
Программист на «си с крестами» и не только

Qt: как работает emit и при каких условиях он переходит в многопоточный режим?

Вот мы в конструкторе потока (который, понятное дело, выполняется из главного потока) пишем:

MyThread::MyThread() : mainControl(откуда-то возьмём)
{
  connect(this, MyThread::doSomething, mainControl->asQobject(), [this]() {
    mainControl->doSomething();
  });
}


и в дальнейшем в потоке
void MyThread::run()
{
  emit doSomething();
}


(mainControl — поле класса, обычный интерфейс C++, mainControl->asQobject() — главная форма программы)

Два вопроса.

1. Будет ли в такой ситуации синхронизация с главным потоком? Или существуют какие-то более интересные методы синхронизироваться с главным потоком?

2. Не пропадёт ли захваченный this, когда мы давно выбрались из той функции, где лямбда была создана?
  • Вопрос задан
  • 678 просмотров
Решения вопроса 1
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
1) Посмотрите на последний аргумент метода connect -- это ответ на ваш вопрос (https://doc.qt.io/qt-5/qobject.html#connect-5 )
2) Не очень понятен вопрос. Лямбда в методе connect работает как обычная лямбда.

Вот тут *почти* всё написано про многопоточность в Qt: https://wiki.qt.io/Threads_Events_QObjects
Тут про лямбды: en.cppreference.com/w/cpp/language/lambda

И да, ваш код не скомпилится по многим причинам. Например, так: *this нельзя писать до 17го стандарта.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы