求助! udp多线程的问题

我做了个udp接收的测试程序,刚开始能收到数据,收了几条数据之后就报个错:

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

然后程序就收不到数据了,但是程序没有崩溃。用的是qt5.4

各位能帮我看下吗,感激不尽!

代码如下:

mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include

#include "udpthread.h"

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

public slots:

void showmessages(QString messages);

private slots:

void on_pushButton_clicked();

private:

Ui::MainWindow *ui;

UdpThread *myUdpThread;

};

#endif // MAINWINDOW_H

udpthread.h

#ifndef UDPTHREAD_H

#define UDPTHREAD_H

#include

#include

#include

class UdpThread : public QThread

{

Q_OBJECT

public:

UdpThread(QObject *parent=0);

~UdpThread();

void run()Q_DECL_OVERRIDE;

signals:

void showmessages(QString messages);

private slots:

void readPendingDatagrams();

private:

QUdpSocket *myUdpSocket;

};

#endif // UDPTHREAD_H

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

}

MainWindow::~MainWindow()

{

delete ui;

}

void MainWindow::showmessages(QString messages)    //显示数据

{

ui->textEdit->append(messages);

}

void MainWindow::on_pushButton_clicked()     //开启udp

{

myUdpThread=new UdpThread(this);

connect(myUdpThread, SIGNAL(showmessages(QString)),

this, SLOT(showmessages(QString)));

myUdpThread->start();

}

udpthread.cpp

#include "udpthread.h"

#include

UdpThread::UdpThread(QObject *parent)

:QThread(parent)

{

}

UdpThread::~UdpThread()

{

this->myUdpSocket->deleteLater();

quit();

wait();

}

void UdpThread::run()

{

qDebug()<

myUdpSocket=new QUdpSocket();

if(myUdpSocket->bind(60004, QUdpSocket::ShareAddress |  //绑定

QUdpSocket::ReuseAddressHint )){

qDebug()<

}

else {

qDebug()<

return;

}

connect(myUdpSocket, SIGNAL(readyRead()),

this, SLOT(readPendingDatagrams()));

exec();

}

void UdpThread::readPendingDatagrams()

{

while(myUdpSocket->hasPendingDatagrams()){

QByteArray datagram;

datagram.resize(myUdpSocket->pendingDatagramSize());

qDebug()<

myUdpSocket->readDatagram(datagram.data(), datagram.size()); //接收数据(根据qDebug信息,就是执行这条语句报错!!!)

qDebug()<

emit showmessages(datagram); //显示数据

}

}

下面是调试信息:

run

bind_success

readPendingDatagrams-1

readPendingDatagrams-2

readPendingDatagrams-1

readPendingDatagrams-2

readPendingDatagrams-1

readPendingDatagrams-2

readPendingDatagrams-1

readPendingDatagrams-2

readPendingDatagrams-1

readPendingDatagrams-2

readPendingDatagrams-1

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

readPendingDatagrams-2

------解决思路----------------------

你的signal是另外一个线程发出的  而你的UI是主线程  主线程里不要绑定非UI线程的signal  而应该受到这个signal后 再次抛出一个signal去调用主线程的slot

------解决思路----------------------

目测这样写应该可以解决问题.

connect(myUdpSocket, SIGNAL(readyRead()),

this, SLOT(readPendingDatagrams()), Qt::DirectConnection);

qt udp多线程收发过程_! udp多线程的有关问题相关推荐

  1. java多线程实现归并排序_利用多线程对数组进行归并排序

    多线程处理归并排序的方法一般为: 假设有n个线程同步处理,就将数组等分成n份,每个线程处理一份,再对最后n个有序数组进行归并. 为了使对整个算法具有可扩展性,即线程数n可以自定义,笔者将线程类.处理数 ...

  2. oracle 多线程调用过程,oracle 存储过程 多线程

    场景: 利用oracle的存储过程实现在sys_sequence表中的多个的自动增长ID的多线程同步解决方案 利用oracle的存储过程实现sys_sequence表的自动增长ID的多线程同步解决方案 ...

  3. c语言多线程收发数据,c语言多线程队列读写

    最近用c语言写了个简单的队列服务,记录一下,文件结构为 main.c queue.c queue.h,代码如下: 主函数 #define NUM_THREADS 200 #include #inclu ...

  4. 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传

    网络概述 协议 在网络之间传出数据时需要按照指定的标准来传输,标准中规定了数据的格式.大小.传输的方式.传输速率.形成统一规范->按照规范开发的代码->协议(应用层.传输层.网络层.链路层 ...

  5. tcp与udp的socket编程,udp代码实现客户端服务端,tcp代码实现客户端服务端(单线程、多线程、多进程分别实现),三次握手

    socket编程 网络字节序 定义 为什么网络数据需要转换为网络字节序? Udp协议 Tcp协议 Udp的socket编程 编程流程 接口 创建套接字 绑定地址信息 发送 接收 关闭 主机字节序转换成 ...

  6. android udp 收发例子_网络协议之TCP和UDP

    首先强调一点,TCP/IP协议是一个协议簇.里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP.IP协议是两个很重要的协议,就用他两命名了. 两个协议的区别实际使用时 ...

  7. 『TensorFlow』第十一弹_队列多线程TFRecod文件_我辈当高歌

    TF数据读取队列机制详解 一.TFR文件多线程队列读写操作 TFRecod文件写入操作 import tensorflow as tf def _int64_feature(value):# valu ...

  8. .net mysql 多线程_.Net多线程问题总结

    转自:http://www.cnblogs.com/yizhu2000/archive/2008/01/03/1011958.html 目录 基础篇 怎样创建一个线程 我只简单列举几种常用的方法,详细 ...

  9. Linux内核分析 - 网络[十二]:UDP模块 - 收发

    内核版本:2.6.34 UDP报文接收        UDP报文的接收可以分为两个部分:协议栈收到udp报文,插入相应队列中:用户调用recvfrom()或recv()系统调用从队列中取出报文,这里的 ...

最新文章

  1. semantic-ui-react图像组件不显示图像的问题
  2. 字符串(一):char 数组
  3. 一些iis配置相关报错的参考
  4. python import io_Python3 IO
  5. JS调用打印机打印Web页面
  6. 深入大数据安全分析(1):为什么需要大数据安全分析?
  7. 手把手教你用python写游戏
  8. 计算机机房规范管理,学校计算机机房如何有效科学规范管理
  9. cad道路里程桩号标注_CAD道路桩号自动编号插件
  10. 微信小程序后端用python_使用django开发微信小程序后端
  11. 正面管教读书笔记 10 你的性格对孩子性格的影响
  12. jquery仿钉钉流程图制作。
  13. ue4 启用ui_如何实现语音的AI启用ui设计原则
  14. win10开机无法自动修复此计算机,win10无限自动修复无法开机怎么办_win10开机自动修复失败如何解决...
  15. OpenSolaris/Solaris 常见问题解答
  16. DOM初探(17)——查看元素的尺寸与位置
  17. android图片显示的方向问题
  18. get a foot in the door 迈出第一步
  19. Levenberger-Marquardt for nonlinear elliptical system
  20. dedecms织梦tag标签当前列表地址

热门文章

  1. OpenGL编程指南12:光照_渲染真实球体
  2. VTK修炼之道52:图形基本操作进阶_多分辨率策略(模型抽取的三种方法)
  3. vs2010 失效后的解决办法
  4. XCTF-Reverse:Hello,CTF
  5. BugkuCTF-Misc:隐写2
  6. 代码段间转移控制时的特权级检查(JMP/CALL)——《x86汇编语言:从实模式到保护模式》读书笔记28
  7. Java之什么是序列化以及为什么要序列化
  8. 计算机与外部设备通讯的接口,总线接口与计算机通信(四)USB外部总线(初级认识)...
  9. 【译】Android中的安全数据-初始化向量
  10. Android 5.0 Usb调试拦截分析及修改