找回密码
 立即注册
收起左侧

多线程 tcpSocket 无法发送数据

2
回复
9718
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2016-12-22 17:26:18 显示全部楼层 |阅读模式
5Qter豆
写了个服务器端程序,需要在线程中发送数据,我在线程的.h文件中定义了一个QTcpSocket * tcpServerConnection,然后在run里面实例化。
用这个tcpServerConnection在run 调用
tcpServerConnection->setSocketDescriptor(socketDescriptor)
紧接着QByteArray data = "test";tcpServerConnection->write(data);
这个数据是可以被发送出去的。

然后我在线程中定义了一个槽函数,在槽函数里再次使用tcpServerConnection来发送数据,就无法发送出去了。
提示信心:QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

我的tcpServerConnection并没有跨线程调用,因为其定义和实例化都是在线程下完成,因该不存在跨线程调用的问题。
所以请教下大家,这个是么原因造成的。

最佳答案

查看完整内容

我来告诉你为什么你跨线程了! 首先你的你的主线程里面定义的你的tcpserver线程,而你的函数是属于你的这个线程的,而你的线程又是主线程定义的。所以你的槽函数的执行是在主线程里面执行的。而你的槽函数却操作了一个由你子线程实例化的指针,这个当然是跨现场操作。 你多想想就这个一定是跨线程。。。 ...
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2016-12-22 17:26:19 显示全部楼层
我来告诉你为什么你跨线程了!
首先你的你的主线程里面定义的你的tcpserver线程,而你的函数是属于你的这个线程的,而你的线程又是主线程定义的。所以你的槽函数的执行是在主线程里面执行的。而你的槽函数却操作了一个由你子线程实例化的指针,这个当然是跨现场操作。
你多想想就这个一定是跨线程。。。
回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2017-1-18 13:45:22 显示全部楼层
线程中只有run函数的内容是不在主线程的,线程对象本身是在主线程的,所以你的槽函数在主线程,执行在run线程,肯定跨线程了。你可以在线程类构造函数和run函数中输出线程id看看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了