多线程QTcpServer在socket断的时候,析构失效的socket的线程和socket对象,新客户端连接时,进入不了incomingConnection

Gary_Cui_1st 2016-04-15 04:58:58
...全文
775 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wei375653972 2018-07-20
  • 打赏
  • 举报
回复
引用 9 楼 yuyu414 的回复:
[quote=引用 1 楼 u010111033 的回复:]
1、我想给你个代码你看看!留下邮箱发给你。
2、movetothread是QT里面禁忌,曾有QT资深研发人员点评过;
3、建议自己写继承于Qthread的run()实现功能,不要取巧。然后在incomingconnection函数写start发出新链接。
4、你的程序个人认为是movetothread不正当应用导致。

你真逗,哪个资深的人说的,moveToThread才是Qt线程的精髓,只是你用错了而已[/quote]
————————————————————————————————————————————
哈哈 可能他自己用错了 被坑了 所以建议别人不用吧
yyxmm 2018-04-20
  • 打赏
  • 举报
回复
引用 1 楼 u010111033 的回复:
1、我想给你个代码你看看!留下邮箱发给你。 2、movetothread是QT里面禁忌,曾有QT资深研发人员点评过; 3、建议自己写继承于Qthread的run()实现功能,不要取巧。然后在incomingconnection函数写start发出新链接。 4、你的程序个人认为是movetothread不正当应用导致。
你真逗,哪个资深的人说的,moveToThread才是Qt线程的精髓,只是你用错了而已
Little柯南 2016-04-20
  • 打赏
  • 举报
回复
引用 6 楼 dayuanyuan1989 的回复:
[quote=引用 4 楼 u010111033 的回复:] 写的server继承于QTcpserver,再写个数据传输类继承于QThread,里面的run()重写并new出socket,做数据处理。 在server的incomeingconnection()里面new一个数据处理类,然后start()执行run。 以上便是QTcpsocket的多客户端思想
还有一点,Qt的设计思路我个人还是不建议你的那种用法,因为我就是从那个方法转成现在的这个方法的。 对于Socket的多线程设计,建议以这样的结构: class TcpSocket : public QTcpSocket { QTcpSocket (int socketDescriptor, QObject* parent = 0); 。。。 } 然后在TcpServer里和我的写法相同。 这样写的好处有至少两点。一就是可以随意的使用connect连接信号与槽。如果你写成run()函数的写法,其在内部使用connect连接信号与槽是没有用的。至于为什么,我目前还不知道,但是我看Qt help里面写的,Multiply Thread里明确说明了,对于永久的线程调用,run形式不建议用connect连接信号与槽,但是可以发送信号。 还有一点就是Socket的问题,因为Socket绑定在对象内,如果对象和Socket不在相通的线程,其会导致Socket异常,异常的主要现象是第一次可以触发readyRead信号,第二次就不能触发readyRead信号了,因为TcpSocket非线程安全。 共同进步。 [/quote] 你说的很对。至于run()里面信号与槽其实是可以运行的: 1、信号与槽的第五个参数,要设置成直接方式,非队列方式,因为要确保执行的线程是在信号发出的线程; 2、必须exec循环,不然第一次进入run()不会执行信号与槽; 当然,其实我们也可以不使用信号与槽,而使用waitfor..()函数阻塞来用。比如waitForNewConnection(),waitForReadyRead()等,使用这些函数执行run时候会马上进入
Gary_Cui_1st 2016-04-20
  • 打赏
  • 举报
回复
引用 7 楼 u010111033 的回复:
[quote=引用 6 楼 dayuanyuan1989 的回复:] [quote=引用 4 楼 u010111033 的回复:] 写的server继承于QTcpserver,再写个数据传输类继承于QThread,里面的run()重写并new出socket,做数据处理。 在server的incomeingconnection()里面new一个数据处理类,然后start()执行run。 以上便是QTcpsocket的多客户端思想
还有一点,Qt的设计思路我个人还是不建议你的那种用法,因为我就是从那个方法转成现在的这个方法的。 对于Socket的多线程设计,建议以这样的结构: class TcpSocket : public QTcpSocket { QTcpSocket (int socketDescriptor, QObject* parent = 0); 。。。 } 然后在TcpServer里和我的写法相同。 这样写的好处有至少两点。一就是可以随意的使用connect连接信号与槽。如果你写成run()函数的写法,其在内部使用connect连接信号与槽是没有用的。至于为什么,我目前还不知道,但是我看Qt help里面写的,Multiply Thread里明确说明了,对于永久的线程调用,run形式不建议用connect连接信号与槽,但是可以发送信号。 还有一点就是Socket的问题,因为Socket绑定在对象内,如果对象和Socket不在相通的线程,其会导致Socket异常,异常的主要现象是第一次可以触发readyRead信号,第二次就不能触发readyRead信号了,因为TcpSocket非线程安全。 共同进步。 [/quote] 你说的很对。至于run()里面信号与槽其实是可以运行的: 1、信号与槽的第五个参数,要设置成直接方式,非队列方式,因为要确保执行的线程是在信号发出的线程; 2、必须exec循环,不然第一次进入run()不会执行信号与槽; 当然,其实我们也可以不使用信号与槽,而使用waitfor..()函数阻塞来用。比如waitForNewConnection(),waitForReadyRead()等,使用这些函数执行run时候会马上进入[/quote] 谢谢回复,方便加个QQ么,以后有些问题好讨论讨论。 我的Q:724835496
Little柯南 2016-04-19
  • 打赏
  • 举报
回复
1、在叮嘱一下,自己写run(),new出来的socket不要有父对象,他是线程里面的东西; 2、在线程里面的槽信号与槽,要么你不用,你直接waitfor...()阻塞;要么exec(),且使用直接连接方式的信号与槽响应,因为执行是在子线程执行,也就是本线程,是与信号发出线程一致的。 以上愚见仅供参考。也希望你尽快解决问题。祝生活愉快。
Little柯南 2016-04-19
  • 打赏
  • 举报
回复
1、我想给你个代码你看看!留下邮箱发给你。 2、movetothread是QT里面禁忌,曾有QT资深研发人员点评过; 3、建议自己写继承于Qthread的run()实现功能,不要取巧。然后在incomingconnection函数写start发出新链接。 4、你的程序个人认为是movetothread不正当应用导致。
Gary_Cui_1st 2016-04-19
  • 打赏
  • 举报
回复
引用 4 楼 u010111033 的回复:
写的server继承于QTcpserver,再写个数据传输类继承于QThread,里面的run()重写并new出socket,做数据处理。 在server的incomeingconnection()里面new一个数据处理类,然后start()执行run。 以上便是QTcpsocket的多客户端思想
还有一点,Qt的设计思路我个人还是不建议你的那种用法,因为我就是从那个方法转成现在的这个方法的。 对于Socket的多线程设计,建议以这样的结构: class TcpSocket : public QTcpSocket { QTcpSocket (int socketDescriptor, QObject* parent = 0); 。。。 } 然后在TcpServer里和我的写法相同。 这样写的好处有至少两点。一就是可以随意的使用connect连接信号与槽。如果你写成run()函数的写法,其在内部使用connect连接信号与槽是没有用的。至于为什么,我目前还不知道,但是我看Qt help里面写的,Multiply Thread里明确说明了,对于永久的线程调用,run形式不建议用connect连接信号与槽,但是可以发送信号。 还有一点就是Socket的问题,因为Socket绑定在对象内,如果对象和Socket不在相通的线程,其会导致Socket异常,异常的主要现象是第一次可以触发readyRead信号,第二次就不能触发readyRead信号了,因为TcpSocket非线程安全。 共同进步。
Gary_Cui_1st 2016-04-19
  • 打赏
  • 举报
回复
引用 4 楼 u010111033 的回复:
写的server继承于QTcpserver,再写个数据传输类继承于QThread,里面的run()重写并new出socket,做数据处理。 在server的incomeingconnection()里面new一个数据处理类,然后start()执行run。 以上便是QTcpsocket的多客户端思想
非常感谢你的回复,问题已经解决了,因为线程二次析构的问题。 在OnDisconnect里主动主动terminate的时候,因为在上面有一句connect(pThread, SIGNAL(disconnected()), pthread, SLOT(deletelater());会触发pthread的再次delete的动作。 我想terminate其本身也是会释放线程资源吧。 所以解决方法就是——把connect那句注释掉就可以了。
Little柯南 2016-04-19
  • 打赏
  • 举报
回复
写的server继承于QTcpserver,再写个数据传输类继承于QThread,里面的run()重写并new出socket,做数据处理。 在server的incomeingconnection()里面new一个数据处理类,然后start()执行run。 以上便是QTcpsocket的多客户端思想
千荒 2016-04-19
  • 打赏
  • 举报
回复
也不是很明白这个新线程怎么处理的。。。 QTcpServer有自己的管理池管理套接字,不需要新建线程,你只需要一个QTcpSocket*的指针list或者map保存这些套接字,然后绑定一个断开则释放这个指针并且删除list或者map里面数据的connect就行了。

16,212

社区成员

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

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