Qt5: Как дождаться сигнала (с фильтром) в потоке? ⇐ C++
-
Anonymous
Qt5: Как дождаться сигнала (с фильтром) в потоке?
Я прочитал пост о том, как дождаться сигнала в потоке, но все еще не понимаю:
Что, если я хочу дождаться сигнала с аргументами и отфильтровать входящие сигналы на основе каких-то конкретных условий?
Предположим, у нас есть signal: Trigged(int i)
Таймер QTimer; timer.setSingleShot(истина); цикл QEventLoop; Connect( this, &MyClass::triggered, &loop, [&](int i) { // только 123 остановит цикл событий, в противном случае продолжайте ждать до истечения времени ожидания если (я == 123) цикл.Выход(); }); Connect( &timer, &QTimer::timeout, &loop, &QEventLoop::quit ); timer.start(msTimeout); цикл.exec(); если (timer.isActive()) qDebug("Получено 123! Оно не может быть передано первым входящим сигналом."); еще qDebug("Тайм-аут"); Вопросы:
[*]Для первого connect, который подключен к лямбде, необходим ли третий аргумент &loop? [*]При первом подключении нужно ли где-нибудь его отключить? [*]Я видел в некоторых комментариях, что внутренний QEventLoop следует использовать очень осторожно, почему? Правильно ли я это делаю? [*]Может ли класс QSignalSpy добиться этого? [*]Можно ли переписать это в многоразовый шаблон заголовка? например, waitForTimeout(отправитель QObject*, сигнал Func1, предикат Func2, целое число мсек)
Я прочитал пост о том, как дождаться сигнала в потоке, но все еще не понимаю:
Что, если я хочу дождаться сигнала с аргументами и отфильтровать входящие сигналы на основе каких-то конкретных условий?
Предположим, у нас есть signal: Trigged(int i)
Таймер QTimer; timer.setSingleShot(истина); цикл QEventLoop; Connect( this, &MyClass::triggered, &loop, [&](int i) { // только 123 остановит цикл событий, в противном случае продолжайте ждать до истечения времени ожидания если (я == 123) цикл.Выход(); }); Connect( &timer, &QTimer::timeout, &loop, &QEventLoop::quit ); timer.start(msTimeout); цикл.exec(); если (timer.isActive()) qDebug("Получено 123! Оно не может быть передано первым входящим сигналом."); еще qDebug("Тайм-аут"); Вопросы:
[*]Для первого connect, который подключен к лямбде, необходим ли третий аргумент &loop? [*]При первом подключении нужно ли где-нибудь его отключить? [*]Я видел в некоторых комментариях, что внутренний QEventLoop следует использовать очень осторожно, почему? Правильно ли я это делаю? [*]Может ли класс QSignalSpy добиться этого? [*]Можно ли переписать это в многоразовый шаблон заголовка? например, waitForTimeout(отправитель QObject*, сигнал Func1, предикат Func2, целое число мсек)
Мобильная версия