如何在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);}
鸿蒙传说
相关分类