Qt QMetaObject::具有编译时检查的invokeMethod替代方案
除了Qt QMetaObject::具有编译时检查的invokeMethod替代方案,qt,signals-slots,compile-time,type-safety,qtcore,Qt,Signals Slots,Compile Time,Type Safety,Qtcore,除了QMetaObject::invokeMethod之外,是否有任何类型安全的方式异步调用方法/插槽(即在GUI线程中排队执行) QMetaObject::invokeMethod没有编译时检查函数名。由于每次调用都会执行查找和字符串匹配,因此通过字符串指定成员函数也会带来开销 我想知道是否有类似于新的QObject::connect语法的东西用于调用提供编译时检查的方法 一种解决方案是使用信号插槽体系结构,但这强制将每个调用方代码包装在QObject类中,以便能够发出该信号。可以使用QTim
QMetaObject::invokeMethod
之外,是否有任何类型安全的方式异步调用方法/插槽(即在GUI线程中排队执行)
QMetaObject::invokeMethod
没有编译时检查函数名。由于每次调用都会执行查找和字符串匹配,因此通过字符串指定成员函数也会带来开销
我想知道是否有类似于新的QObject::connect
语法的东西用于调用提供编译时检查的方法
一种解决方案是使用信号插槽体系结构,但这强制将每个调用方代码包装在QObject类中,以便能够发出该信号。可以使用QTimer::singleShot实现此目的
QTimer::singleShot(0, object, &Object::method...);
--
QTimer::singleShot(0, object, [object](){
object->method(arg1, arg2, ...);
});
注意:调用QTimer::singleShot
的线程必须具有QEventLoop
请参见此
模板bool QMetaObject::invokeMethod(QObject*context,Functor函数,FunctorReturnType*ret)
这是一个重载函数
使用连接类型Qt::AutoConnection在上下文的事件循环中调用函数。函数可以是函子或指向成员函数的指针。如果可以调用函数,则返回true。如果没有此类成员或参数不匹配,则返回false。函数调用的返回值放在ret中
注意:此函数是线程安全的
这个函数是在Qt5.10中引入的。我认为基本上是这样。@peppe:看来没有其他选择了:看一看。因此,您可以这样做,而不是
QMetaObject::invokeMethod(object,“method”)
,{QObject src;QObject::connect(&src,&QObject::destromed,object,&object::method);}
您甚至可以通过这种方式将lamba函数与上下文QObject
一起使用@迈克:好把戏!虽然这提供了编译时检查,但我想知道与字符串查找相比,它的开销有多大。您的代码段是一个不支持传递参数的示例,但是您的链接(posttohread
template函数)中提出的解决方案也支持传递参数,对吗?是的。我在Mike提供的链接中看到了这个解决方案。与其他方法相比,您对该解决方案的开销有何评论?