2016-08-14 97 views
3

除了QMetaObject::invokeMethod是否有任何異步調用方法/槽的類型安全的方法(又名排隊其在GUI線程中的執行)?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

看看[this](https://stackoverflow.com/a/21653558/2666212)。因此,你可以這樣做,而不是'QMetaObject :: invokeMethod(object,「method」)'':{QObject src; QObject :: connect(&src,&QObject :: destroyed,object,&Object :: method);}'你甚至可以使用帶有'QObject'上下文的lamba函數。 。 。 – Mike

回答

0

有可能使用QTimer :: singleShot用於此目的

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

注:其中QTimer::singleShot調用必須有一個QEventLoop線程。

+0

是的。我在Mike提供的鏈接中看到了這個解決方案。與其他方法相比,您是否對此解決方案的開銷有任何評論? – Isaac