异想天开

What's the true meaning of light, Could you tell me why

Qt跨线程创建对象

日期:2020-02-19 08:43:31
  
最后更新日期:2020-02-26 16:27:45
起因是在家写一个qt的程序,程序运行了就core。 查看控制台打印出如下信息:

QObject::setParent: cannot set parent, new parent is in a different thread
含义其实好理解,就是在调用线程创建的对象的父亲对象在另外一个线程,这种场景比如一个线程创建了一个全局的对象networkaccess,然后其他线程从这个线程创建新的子对象networkrequest。 后面看了参考1后,才发现之前已经有解决过类似问题的技巧,当时是借助qt内部的信号机制,通过调用线程emit释放信号给被调用线程的对象。总结一下,目前在qt通过信号槽的机制做到跨线程创建对象。

方法一. 通过调用线程emit发送信号
如下示例,发送setValue信号,被调线程绑定信号的信号槽函数
[code lang="cpp"]
void MyWebView::setcmd(int cmd) {
emit setValue(cmd);
}
[/code]
方法二. 通过参考1看到的方法。利用invokeMethod告诉对方线程调用,它某个对象的某个函数。
比如下示例,当下载完成时,提醒对方线程渲染新的下载完成比例。
[code lang="cpp"]
QMetaObject::invokeMethod(g_inst, "updateDwnProcess", Qt::QueuedConnection, Q_ARG(int,g_need_size), Q_ARG(int,g_down_size));
[/code]
have fun!
参考:
1. https://stackoverflow.com/questions/35868750/qobjectsetparent-cannot-set-parent-new-parent-is-in-a-different-thread