2016-08-14 8 views
3

Кроме того, QMetaObject::invokeMethod существует ли какой-либо безопасный способ вызова метода/слота асинхронно (a.k.a его выполнение в потоке графического интерфейса)?QMetaObject :: invokeMethod альтернатива с проверкой времени компиляции

QMetaObject::invokeMethod не имеет проверки времени на компиляцию имен функций. Существует также накладные расходы при определении функции-члена строкой, так как для каждого вызова выполняется поиск и сопоставление строк.

Интересно, есть ли что-то похожее на новый синтаксис QObject::connect для вызова метода, который обеспечивает проверку времени компиляции.

Одно из решений использует архитектуру сигнального слота, но это обеспечивает обертывание каждого кода вызывающего абонента в классе QObject, чтобы он мог испускать этот сигнал.

+0

Это, по сути, https://bugreports.qt.io/browse/QTBUG-36861, я думаю. – peppe

+0

@peppe: Кажется, нет альтернативы: https://bugreports.qt.io/browse/QTBUG-55304 – Isaac

+0

Взгляните на [это] (https://stackoverflow.com/a/21653558/2666212). Таким образом, вместо 'QMetaObject :: invokeMethod (object," method ")' вы можете сделать что-то вроде этого: '{QObject src; QObject :: connect (& src, & QObject :: destroy, object, & Object :: method);} 'вы можете даже использовать функцию lamba с контекстом' QObject' таким образом. , , – Mike

ответ

0

можно использовать QTimer :: SingleShot для этой цели

QTimer::singleShot(0, object, &Object::method...); 
-- 
QTimer::singleShot(0, object, [object](){ 
    object->method(arg1, arg2, ...); 
}); 

Примечание: Поток, в котором QTimer::singleShot вызывается должен иметь QEventLoop.

+0

Да. Я видел это решение по ссылке, предоставленной Майком. Есть ли у вас комментарии по накладным расходам этого решения по сравнению с другими методами? – Isaac

 Смежные вопросы

  • Нет связанных вопросов^_^