qt 信号与槽的夸线程问题

zhenimei100 2017-09-08 08:16:28
报错:QObject: Cannot create children for a parent that is in a different thread.如何解决?
两个线程都有信号,信号在run函数里释放。connect放在线程类的构造函数里。connect第5个参数我是BlockingQueuedConnection的。
这两个线程释放的信号,都是给全局变量(槽函数在这里)。

我该如何修改,才能解决上面的报错?我网上查,说是夸线程问题,但是都没说怎么解决。。。。。
...全文
1207 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这个问题在网上有解答,尤其是多年前dbzhang800的博客里就有,名字叫《QThread的使用方法》,不过这位大神的博客貌似N久不更新了。你百度下这段内容“昨天不小心看到Qt开发人员( Bradley T. Hughes)Blog中的一片文章 you are-doing-it-wrong 。 ”应该还能找到那篇文章,不过应该都是转载的了。 我根据他的方法试过,的确是可行的,所以你最好还是看下那篇文章。我根据他的方法写过的一段简单的测试代码,代码太长,节选: class IecReadThreadObj : public QObject { Q_OBJECT public: IecReadThreadObj(ZMainWindow* mainwin) { m_mainwin = mainwin; } public slots: void readLDList(); signals: void readLDNamesDone(); private: ZMainWindow* m_mainwin; }; 在ZMainWindow中定义了 IecReadThreadObj m_obj; QThread m_thread; ZMainWindow::ZMainWindow(QWidget *parent) : QMainWindow(parent), m_obj(this) { m_obj.moveToThread(&m_thread); m_thread.start(); connect(this, &ZMainWindow::sigReadLDList, &m_obj, &IecReadThreadObj::readLDList); connect(&m_obj, SIGNAL(readLDNamesDone()), this, SLOT(slotReadLDNamesDone())); initClient(); } 在当前用户线程发出读命令,会转到线程中去执行IecReadThreadObj::readLDList IecReadThreadObj::readLDList执行完毕后会发出readLDNamesDone信号,用户界面会在槽slotReadLDNamesDone中响应
zhenimei100 2017-09-08
  • 打赏
  • 举报
回复
我这个全局变量含qtcpsocket,但是不是线程。所以我该怎么整? 我试着把这个全局变量movetothread,貌似并没有起效。
  • 打赏
  • 举报
回复
创建qtcpsocket时,不要放到run函数外。线程的run函数里面创建的对象跟在线程的构造函数里面创建的对象不是在同一个线程,线程构造函数里面创建的对象属于主线程,在run函数里面创建或者运行的对象属于子线程。你这里出现的问题应该是在主线程中声明,在run函数里面创建,因此就有跨线程的问题。将声明与创建都放在子线程里面,即run函数里面,就可以避免这个问题。
zhenimei100 2017-09-08
  • 打赏
  • 举报
回复
补充下,全局变量收到其中一个线程的信号,是操作自己的定时器的;收到另一个线程的信号,是操作自己的qtcpsocket的。 很奇怪的是,出这个报错的时候,程序还能正常跑。。。。。

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧