如何在Qt,gcd样式的给定线程中执行函子或lambda?
dispatch_sync(dispatch_get_main_queue(), ^{ /* do sth */ });dispatch_async(dispatch_get_main_queue(), ^{ /* do sth */ });[]{ /* do sth */ }
QApplication::instance()
QApplication
#include <QApplication>#include <QThread>#include <QMetaMethod>#include <functional>#include <assert.h>class App : public QApplication{
Q_OBJECTpublic:
App();signals:public slots:
void genericExec(std::function<void(void)> func) {
func();
}private:
// cache this
QMetaMethod genericExec_method;public:
void invokeGenericExec(std::function<void(void)> func, Qt::ConnectionType connType) {
if(!genericExec_method) {
QByteArray normalizedSignature = QMetaObject::normalizedSignature("genericExec(std::function<void(void)>)");
int methodIndex = this->metaObject()->indexOfSlot(normalizedSignature);
assert(methodIndex >= 0);
genericExec_method = this->metaObject()->method(methodIndex);
}
genericExec_method.invoke(this, connType, Q_ARG(std::function<void(void)>, func));
}};static inlinevoid execInMainThread_sync(std::function<void(void)> func) {
if(qApp->thread() == QThread::currentThread())
func();
else {
((App*) qApp)->invokeGenericExec(func, Qt::BlockingQueuedConnection);
}}static inlinevoid execInMainThread_async(std::function<void(void)> func) {
((App*) qApp)->invokeGenericExec(func, Qt::QueuedConnection);}
蝴蝶不菲
鸿蒙传说
随时随地看视频慕课网APP
相关分类