求助:qt线程中使用QTcpSocket发送数据报错

兔腿 2018-07-18 09:21:02
创建了一个线程,在run函数里new了一个QTcpSocket,在线程定时器响应函数里周期性使用QTcpSocket发送数据,write时报如下错误:
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
查了一下,说是QTcpSocket的创建和使用要在同一个线程里,但是我的创建和使用是在一个线程里啊,为什么还是报错?

代码如下:

void AliveScoketThr::run()
{
m_AliveSocket =new QTcpSocket(this);

m_AliveSocket->connectToHost("192.168.0.10",15433,QTcpSocket::ReadWrite);
connect(m_AliveSocket,SIGNAL(connected()),this,SLOT(on_alive_connected()));

msleep(10);
QTimer * pTimer = new QTimer;
pTimer->setInterval(30);

connect(pTimer , SIGNAL(timeout()) , this , SLOT(on_alive_timer())) ;
pTimer->start() ;

exec();
}

void AliveScoketThr::on_alive_timer()
{
char buff[12];
buff[0] = 9;
unsigned long *pLen = (unsigned long *)(buff+1);
*pLen = 3;
strcpy(buff+5,"any");
m_AliveSocket->write(buff,8); //该处报错
}

求助啊,各位大侠帮帮忙。
...全文
679 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
不易易 2018-07-27
  • 打赏
  • 举报
回复
只有run 运行在线程里,socket在线程里创建的, on_alive_timer()就不在线程里运行的吧,所以socket错误!!!请大神确认!!!!
月凉西厢 2018-07-25
  • 打赏
  • 举报
回复
之前就被qt的这个问题差点坑哭了。
解决办法是,想办法把on_alive_connected固定在主线程上运行
_Will_ 2018-07-19
  • 打赏
  • 举报
回复
不过你QTCPSocket,QTimer销毁的时候也只能在 run的线程里执行,Qt的对象实例都是有线程归属的,在哪个线程创建的,就只能在哪个线程销毁
_Will_ 2018-07-19
  • 打赏
  • 举报
回复 2
connect(pTimer , SIGNAL(timeout()) , this , SLOT(on_alive_timer()),Qt::DirectConnection) ;
_Will_ 2018-07-19
  • 打赏
  • 举报
回复
引用 2 楼 weixin_42721421 的回复:
[quote=引用 1 楼 jxgyzhang 的回复:]
QTimer的回调线程一直都是一个单独的线程,和你创建的QTCPSocket,不在同一个线程。你在run里写个while,发送一次休眠30毫秒


线程AliveScoketThr还要响应别的SIGNAL,写while会阻塞住SIGNAL;而且我还要接收socket的数据,也不方便用休眠。还有别的方法吗?[/quote]

3楼说的this问题,你需要取消掉,parent按道理应该是在主线程创建的,跟你创建QTCPSocket应该不在同一个线程,另外QTimer的槽如果选择Auto的连接方式,我记得是一直都在主线程中执行槽,你可以把Auto的连接方式改成Qt::DirectConnection,这样就是在run的线程中执行了
FlyWM_ 2018-07-18
  • 打赏
  • 举报
回复
m_AliveSocket =new QTcpSocket(this); 这一句把this去掉,去掉this才会在申请在次线程的堆空间。
题外话:建议楼主使用moveToThread的方法而不是重写run函数。
兔腿 2018-07-18
  • 打赏
  • 举报
回复
引用 1 楼 jxgyzhang 的回复:
QTimer的回调线程一直都是一个单独的线程,和你创建的QTCPSocket,不在同一个线程。你在run里写个while,发送一次休眠30毫秒


线程AliveScoketThr还要响应别的SIGNAL,写while会阻塞住SIGNAL;而且我还要接收socket的数据,也不方便用休眠。还有别的方法吗?
_Will_ 2018-07-18
  • 打赏
  • 举报
回复
QTimer的回调线程一直都是一个单独的线程,和你创建的QTCPSocket,不在同一个线程。你在run里写个while,发送一次休眠30毫秒

16,175

社区成员

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

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