[问题] QMetaObject 问题

楼主: MOONY135 (谈无欲)   2019-03-27 13:12:17
开发平台(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事件来实现安全的跨线程调用,然后立即返回"
请问有人可以告诉我我的做法有可能会有哪些问题
他的写法有哪些好处吗
作者: bigbite (子子孙孙永保用)   2019-03-28 23:38:00
不管是用signal/slot或是QInvokeMethod都是为了保证thread safe

Links booklink

Contact Us: admin [ a t ] ucptt.com