作者MOONY135 (脫俗仙子談無慾)
看板C_and_CPP
標題[問題] QMetaObject 問題
時間Wed Mar 27 13:12:17 2019
開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1553663539.A.A7F.html
1F:推 bigbite: 不管是用signal/slot或是QInvokeMethod都是為了保證 03/28 23:38
2F:→ bigbite: thread safe 03/28 23:38