четверг, 2 февраля 2023 г.

QTimer::singleShot() как средство асинхронного вызова слота (альтернатива QMetaObject::invokeMethod)

 Предположим, есть класс 

class X: public QObject { public slots: void slotX(int x); };



Чтобы асинхронно вызвать slotX (например, из метода того же класса X), используют QMetaObject::invokeMethod():


QMetaObject::invokeMethod(this, "slotX", Qt::QueuedConnection, Q_ARG(int, 123));

Ужасный и неудобный синтаксис, однако.
Вместо этого можно создать таймер с нулевым временем ожидания, который сразу же отправит сигнал в очередь сигналов: 


QTimer::singleShot(0, [this]() { slotX(123); });



или


QTimer::singleShot(0, this, [this]() { slotX(123); });

Мы тут обошлись вообще без слотов.
Здесь добавленный параметр this - т.н. "контекст", Для контроля существования объекта - получателя (в данном случае объекта this), сие особенно полезно при передаче сигналов между нитями. Если контекст получателя не существует, сообщение даже не будет поставлено в очередь.
Напомню, что если нить объекта контекста не совпадает с нитью эмиттера сигнала, такой сигнал будет поставлен в очередь объекта нити-приемника.










Комментариев нет:

Отправить комментарий

QSettings: работа с ini файлом, русские символы.

  QSettings работает в т.ч. и с ini файлами. Локальные (русские, например) символы обрабатываются с помощью кодеков. Наверное, ini файл сле...