qt udp多线程收发过程_! udp多线程的有关问题
求助! 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多线程的有关问题相关推荐
- java多线程实现归并排序_利用多线程对数组进行归并排序
多线程处理归并排序的方法一般为: 假设有n个线程同步处理,就将数组等分成n份,每个线程处理一份,再对最后n个有序数组进行归并. 为了使对整个算法具有可扩展性,即线程数n可以自定义,笔者将线程类.处理数 ...
- oracle 多线程调用过程,oracle 存储过程 多线程
场景: 利用oracle的存储过程实现在sys_sequence表中的多个的自动增长ID的多线程同步解决方案 利用oracle的存储过程实现sys_sequence表的自动增长ID的多线程同步解决方案 ...
- c语言多线程收发数据,c语言多线程队列读写
最近用c语言写了个简单的队列服务,记录一下,文件结构为 main.c queue.c queue.h,代码如下: 主函数 #define NUM_THREADS 200 #include #inclu ...
- 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传
网络概述 协议 在网络之间传出数据时需要按照指定的标准来传输,标准中规定了数据的格式.大小.传输的方式.传输速率.形成统一规范->按照规范开发的代码->协议(应用层.传输层.网络层.链路层 ...
- tcp与udp的socket编程,udp代码实现客户端服务端,tcp代码实现客户端服务端(单线程、多线程、多进程分别实现),三次握手
socket编程 网络字节序 定义 为什么网络数据需要转换为网络字节序? Udp协议 Tcp协议 Udp的socket编程 编程流程 接口 创建套接字 绑定地址信息 发送 接收 关闭 主机字节序转换成 ...
- android udp 收发例子_网络协议之TCP和UDP
首先强调一点,TCP/IP协议是一个协议簇.里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP.IP协议是两个很重要的协议,就用他两命名了. 两个协议的区别实际使用时 ...
- 『TensorFlow』第十一弹_队列多线程TFRecod文件_我辈当高歌
TF数据读取队列机制详解 一.TFR文件多线程队列读写操作 TFRecod文件写入操作 import tensorflow as tf def _int64_feature(value):# valu ...
- .net mysql 多线程_.Net多线程问题总结
转自:http://www.cnblogs.com/yizhu2000/archive/2008/01/03/1011958.html 目录 基础篇 怎样创建一个线程 我只简单列举几种常用的方法,详细 ...
- Linux内核分析 - 网络[十二]:UDP模块 - 收发
内核版本:2.6.34 UDP报文接收 UDP报文的接收可以分为两个部分:协议栈收到udp报文,插入相应队列中:用户调用recvfrom()或recv()系统调用从队列中取出报文,这里的 ...
最新文章
- semantic-ui-react图像组件不显示图像的问题
- 字符串(一):char 数组
- 一些iis配置相关报错的参考
- python import io_Python3 IO
- JS调用打印机打印Web页面
- 深入大数据安全分析(1):为什么需要大数据安全分析?
- 手把手教你用python写游戏
- 计算机机房规范管理,学校计算机机房如何有效科学规范管理
- cad道路里程桩号标注_CAD道路桩号自动编号插件
- 微信小程序后端用python_使用django开发微信小程序后端
- 正面管教读书笔记 10 你的性格对孩子性格的影响
- jquery仿钉钉流程图制作。
- ue4 启用ui_如何实现语音的AI启用ui设计原则
- win10开机无法自动修复此计算机,win10无限自动修复无法开机怎么办_win10开机自动修复失败如何解决...
- OpenSolaris/Solaris 常见问题解答
- DOM初探(17)——查看元素的尺寸与位置
- android图片显示的方向问题
- get a foot in the door 迈出第一步
- Levenberger-Marquardt for nonlinear elliptical system
- dedecms织梦tag标签当前列表地址
热门文章
- OpenGL编程指南12:光照_渲染真实球体
- VTK修炼之道52:图形基本操作进阶_多分辨率策略(模型抽取的三种方法)
- vs2010 失效后的解决办法
- XCTF-Reverse:Hello,CTF
- BugkuCTF-Misc:隐写2
- 代码段间转移控制时的特权级检查(JMP/CALL)——《x86汇编语言:从实模式到保护模式》读书笔记28
- Java之什么是序列化以及为什么要序列化
- 计算机与外部设备通讯的接口,总线接口与计算机通信(四)USB外部总线(初级认识)...
- 【译】Android中的安全数据-初始化向量
- Android 5.0 Usb调试拦截分析及修改