第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在Qt,gcd樣式的給定線程中執(zhí)行函子或lambda?

如何在Qt,gcd樣式的給定線程中執(zhí)行函子或lambda?

C++
蝴蝶不菲 2019-06-24 13:07:21
如何在Qt,gcd樣式的給定線程中執(zhí)行函子或lambda?在使用GCD的objc中,有一種在旋轉(zhuǎn)事件循環(huán)的線程中執(zhí)行l(wèi)ambda的方法。例如:dispatch_sync(dispatch_get_main_queue(), ^{ /* do sth */ });或:dispatch_async(dispatch_get_main_queue(), ^{ /* do sth */ });它執(zhí)行一些東西(相當(dāng)于[]{ /* do sth */ }在主線程的隊(duì)列中,無論是阻塞還是異步。我怎么能在Qt中做同樣的事情呢?根據(jù)我所讀到的,我想解決辦法是以某種方式向主線程的某個(gè)對象發(fā)送一個(gè)信號。但什么目標(biāo)?只是QApplication::instance()?(這是唯一存在于主線程中的對象。)什么信號?從目前的答案和我目前的研究來看,我確實(shí)需要一些虛擬對象來坐在主線程中,其中有一些插槽,只是等待進(jìn)入一些代碼來執(zhí)行。所以,我決定把QApplication再加一句。我當(dāng)前的代碼不起作用(但也許你可以幫上忙):#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貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊

這樣的東西會(huì)有用嗎?

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));}

這段代碼將使您的lambda盡可能快地在主線程事件循環(huán)上運(yùn)行。不支持args,這是一個(gè)非常基本的代碼。

注意:我沒有正確地測試它。


查看完整回答
反對 回復(fù) 2019-06-24
  • 3 回答
  • 0 關(guān)注
  • 560 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號