如何在Qt,gcd樣式的給定線程中執行函子或lambda?在使用GCD的objc中,有一種在旋轉事件循環的線程中執行lambda的方法。例如:dispatch_sync(dispatch_get_main_queue(), ^{ /* do sth */ });或:dispatch_async(dispatch_get_main_queue(), ^{ /* do sth */ });它執行一些東西(相當于[]{ /* do sth */ }在主線程的隊列中,無論是阻塞還是異步。我怎么能在Qt中做同樣的事情呢?根據我所讀到的,我想解決辦法是以某種方式向主線程的某個對象發送一個信號。但什么目標?只是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);}
3 回答
鴻蒙傳說
TA貢獻1865條經驗 獲得超7個贊
這樣的東西會有用嗎?
template <typename Func>inline static void MyRunLater(Func func) {
QTimer *t = new QTimer();
t->moveToThread(qApp->thread());
t->setSingleShot(true);
QObject::connect(t, &QTimer::timeout, [=]() {
func();
t->deleteLater();
});
QMetaObject::invokeMethod(t, "start", Qt::QueuedConnection, Q_ARG(int, 0));}- 3 回答
- 0 關注
- 571 瀏覽
添加回答
舉報
0/150
提交
取消
