[問題] QMetaObject 問題

看板C_and_CPP (C/C++)作者 (脫俗仙子談無慾)時間7年前 (2019/03/27 13:12), 編輯推噓1(101)
留言2則, 1人參與, 7年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) win7 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) vs2015 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) qt5.7 問題(Question): void Worker::listen(quint16 port, bool auto_accept, const QByteArray &password){ m_server = new QUdpSocket(this); m_negotiation_string = negotiation_string.leftJustified(128, char(0), true); m_id = id; if (!m_server->bind(QHostAddress::AnyIPv4, port)) { emit error(m_server->errorString()); return; } connect(m_server, &QUdpSocket::readyRead, this, &DiscoverServer::readyRead); } bool LibCore::start(){ m_worker = new Worker(this); } void LibCore::listen(quint16 port, bool auto_accept, const QByteArray &password) { if (!RUNNING) return; QMetaObject::invokeMethod(m_worker, "listen", Qt::BlockingQueuedConnection, Q_ARG(quint16, port), Q_ARG(bool, auto_accept), Q_ARG(QByteArray, password)); } 想問寫法差異 這幾天看到一個專案是用QMetaObject::invokeMethod去call Worker的 function 去查完之後發現 之前要做類似的事情的時候 我是使用 m_worker->listen(port, auto_accept, password); 而不是 QMetaObject::invokeMethod(m_worker, "listen", Qt::BlockingQueuedConnection, Q_ARG(quint16, port), Q_ARG(bool, auto_accept), Q_ARG(QByteArray, password)); 想知道為甚麼會是這樣子使用 查完之後得到這個答案 "在Qt中,通過QMetaObject::invokeMethod和Qt::QueuedConnection, 我們可以向不同線程的對象發送MetaCall事件來實現安全的跨線程調用,然後立即返回" 請問有人可以告訴我我的做法有可能會有哪些問題 他的寫法有哪些好處嗎 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.9.157 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1553663539.A.A7F.html

03/28 23:38, 7年前 , 1F
不管是用signal/slot或是QInvokeMethod都是為了保證
03/28 23:38, 1F

03/28 23:38, 7年前 , 2F
thread safe
03/28 23:38, 2F
文章代碼(AID): #1ScmOpf_ (C_and_CPP)
文章代碼(AID): #1ScmOpf_ (C_and_CPP)