跨线程使用socket的问题

cdpcsc 2016-01-21 09:47:06
看到有人说QTcpSocket不能跨线程使用(没在文档上看到这样的描述)但我遇到的问题是可以跨线程读数据,却不能写数据,如下:
void ReciveWorker::readPendingDatagrams()
{
qDebug() << "ReciveWorker thread id:" << QThread::currentThreadId();
QByteArray by = Conn->socket()->readAll();
qDebug() << "ReciveWorker recive data:" << by;
Conn->socket()->write(by);
}

主线程创建的socket,在worker线程中read没问题,write时失败,并输出一行错误信息;QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

本来还有一个线程单独负责在这个socket上write,发现不能发送数据。结果发现在可以read的线程里也不能write。这是什么道理?
...全文
1902 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
千荒 2016-08-24
  • 打赏
  • 举报
回复
引用 4 楼 pulller 的回复:
[quote=引用 2 楼 zsmd000 的回复:] worker线程类添加一个写的信号(假设是 void sendData(const QByteArray&)) 创建worker线程的时候这个写的信号和主线程的槽函数绑定(假设是void sockSend(const QByteArray&)) 然后在void sockSend(const QByteArray&) 写发送给socket的方法,之后子线程worker要是想write数据就直接调用

QByteArray data ="XXXX";
emit sendData(data);
就行了
如果有多个子线程同时发送信号给主线程的话,主线程会阻塞住,直接挂掉。[/quote] 很久没登录了,如果是多个任务的话应该使用生产者消费者模型,将待发送的数据放到队列中(全局数据,通常是一个静态成员List),同时唤醒中间线程线程逐一读取List,中间线程按照队列发送信号给主线程(即之前的 emit sendData(data);)。
caiwei_cs 2016-06-27
  • 打赏
  • 举报
回复
应该是socket类不是线程安全的吧??你可以查一下资料
caiwei_cs 2016-06-27
  • 打赏
  • 举报
回复
用信号与槽或者invokemethod,他说不能自然是有原因的。
sichuanwww 2016-06-26
  • 打赏
  • 举报
回复
xunxunmimizhong 2016-06-18
  • 打赏
  • 举报
回复
引用 2 楼 zsmd000 的回复:
worker线程类添加一个写的信号(假设是 void sendData(const QByteArray&)) 创建worker线程的时候这个写的信号和主线程的槽函数绑定(假设是void sockSend(const QByteArray&)) 然后在void sockSend(const QByteArray&) 写发送给socket的方法,之后子线程worker要是想write数据就直接调用

QByteArray data ="XXXX";
emit sendData(data);
就行了
如果有多个子线程同时发送信号给主线程的话,主线程会阻塞住,直接挂掉。
xunxunmimizhong 2016-06-18
  • 打赏
  • 举报
回复
引用 2 楼 zsmd000 的回复:
worker线程类添加一个写的信号(假设是 void sendData(const QByteArray&)) 创建worker线程的时候这个写的信号和主线程的槽函数绑定(假设是void sockSend(const QByteArray&)) 然后在void sockSend(const QByteArray&) 写发送给socket的方法,之后子线程worker要是想write数据就直接调用

QByteArray data ="XXXX";
emit sendData(data);
就行了
这个方法不错,今天刚好遇到这个问题。
千荒 2016-01-26
  • 打赏
  • 举报
回复
worker线程类添加一个写的信号(假设是 void sendData(const QByteArray&)) 创建worker线程的时候这个写的信号和主线程的槽函数绑定(假设是void sockSend(const QByteArray&)) 然后在void sockSend(const QByteArray&) 写发送给socket的方法,之后子线程worker要是想write数据就直接调用

QByteArray data ="XXXX";
emit sendData(data);
就行了
itsmypink 2016-01-22
  • 打赏
  • 举报
回复
我也碰到了楼主一样的问题,跨线程的tcpsocket发送不了信息,也是报同样的错误。 但我没试过读信息

16,153

社区成员

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

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