QT编程问题小结(编译、多线程、UDP Socket等)
2017-04-29 12:55
417 查看
1. 编译问题(error 127)
如果计算机中配置了MinGW、CygWin等编译器,那么在编译QT程序时可能会报错,错误代码为 error 127.
这时把系统环境变量PATH中MinGW、CygWin的路径删除,或者修改MinGW、CygWin的文件夹名称(使系统环境变量无效),即可解决上述问题。
2.多线程使用心得
(1)多线程的一种方法是使用QThread类,并且需要使用moveToThread函数。一个简单的代码片段如下:
举一个简单的例子,设置两个button,分别connect到两个槽函数。假设第一个槽函数需要执行5秒,那么按下button1后,立即点击button2就会造成界面死掉,只有等到5秒中之后才能按button2. 所以如果一个button执行时间过长或者说会进入一个死循环,建议使用多线程。
(3)什么时候使用多线程?我的理解是:只要不是界面的操作,就使用多线程,使程序有较好的扩展性。这是一个好习惯。
例如:网络收发、文件存储等操作最好都在独立于主界面的新线程里实现。
3. 建立日志文件
建立日志文件是个好习惯,使用QFile类非常方便。可在日志文件中记录一些重要的信息,如软件启动、什么命令执行了等。
4.Qt中的UDP socket接收数据包单包最多512字节
(注:本条记录是错误的!我在两台机器上,一台使用MATLAB的UDP Socket,一台使用QT的UDP Socket,事实证明被拆包成512字节是MATLAB的UDP Socket干的。)
例如两台计算机A和B,B向A发送一个1024字节数据包,使用UDP来实现。在计算机A中用QT编程接收。那么QUdpSocket的hasPendingDatagrams函数将会监测到两次有数据(每次512个字节)。使用QByteArray类、QUdpSocekt类接收数据和拼包比较方便。
如下面的代码片段。
除了主进程,如果在自己开辟的进程里新建一个QUdpSocket,并且在定义时没有把this指针传进去,即:
QSocketNotifier:Socketnotifierscannotbeenabledordisabledfromanotherthread
[2017-04-29]
如果计算机中配置了MinGW、CygWin等编译器,那么在编译QT程序时可能会报错,错误代码为 error 127.
这时把系统环境变量PATH中MinGW、CygWin的路径删除,或者修改MinGW、CygWin的文件夹名称(使系统环境变量无效),即可解决上述问题。
2.多线程使用心得
(1)多线程的一种方法是使用QThread类,并且需要使用moveToThread函数。一个简单的代码片段如下:
QThread *m_pThread = new QThread; m_pThread->start(); my_class->moveToThread(m_pThread);(2)connect将信号与槽函数联系起来,容易给初学者一种误解,就是一个槽函数占用了一个线程。但实际上并不是。
举一个简单的例子,设置两个button,分别connect到两个槽函数。假设第一个槽函数需要执行5秒,那么按下button1后,立即点击button2就会造成界面死掉,只有等到5秒中之后才能按button2. 所以如果一个button执行时间过长或者说会进入一个死循环,建议使用多线程。
(3)什么时候使用多线程?我的理解是:只要不是界面的操作,就使用多线程,使程序有较好的扩展性。这是一个好习惯。
例如:网络收发、文件存储等操作最好都在独立于主界面的新线程里实现。
3. 建立日志文件
建立日志文件是个好习惯,使用QFile类非常方便。可在日志文件中记录一些重要的信息,如软件启动、什么命令执行了等。
4.Qt中的UDP socket接收数据包单包最多512字节
(注:本条记录是错误的!我在两台机器上,一台使用MATLAB的UDP Socket,一台使用QT的UDP Socket,事实证明被拆包成512字节是MATLAB的UDP Socket干的。)
例如两台计算机A和B,B向A发送一个1024字节数据包,使用UDP来实现。在计算机A中用QT编程接收。那么QUdpSocket的hasPendingDatagrams函数将会监测到两次有数据(每次512个字节)。使用QByteArray类、QUdpSocekt类接收数据和拼包比较方便。
如下面的代码片段。
QByteArray net_recv_packet; //接UDP小包 QByteArray net_recv_data; // 拼包 QUdpSocket *socket_recv = new QUdpSocket(this); while( socket_recv->hasPendingDatagrams()) // 有数据 { net_recv_packet.resize(socket_recv->pendingDatagramSize()); socket_recv->readDatagram(net_recv_packet.data(),net_recv_packet.size()); net_recv_buffer += net_recv_packet; }5. new QUdpSocket(this)
除了主进程,如果在自己开辟的进程里新建一个QUdpSocket,并且在定义时没有把this指针传进去,即:
QUdpSocket *my_udp_socket = new QUdpSocket();而不是:
QUdpSocket *my_udp_socket = new QUdpSocket(this);那么编译虽然不会报错,但在执行时,UDPSocket只能收到一包而不能持续接收数据,并且在应用程序输出中会出这么一句提示:
QSocketNotifier:Socketnotifierscannotbeenabledordisabledfromanotherthread
[2017-04-29]
相关文章推荐
- 使用QUdpSocket时编译出错的问题
- Socket多线程问题【转载】
- 交叉编译D-BUS时遇到abstract socket的问题。
- 黑马程序员--学习多线程和Socket小结
- 关于java Socket与C#通信编码问题小结
- 【Cocos2dx网络通信(Http&Socket)编译到Android总结】编译加入curl关联lib与头文件等问题
- SOCKET UDP 通讯过程中 10022 和 10014 偶尔出现问题
- 非阻塞socket编程问题小结
- 弄VLC的时候 eclipse编译多线程程序如果出现问题 注意这个地方
- UDP 协议 C# UdpClient乱序接收数据包丢失的问题 Socket ReceiveBufferSize
- 编译busybox是遇到的问题--- [networking/tcpudp.o] 错误 1
- 关于C# socket多线程的7个问题.希望大家发表一下意见.
- 有关socket通信包大小的问题总结(UDP传输模式)
- C++多线程编程以及epoll处理socket通信时多端口问题
- debug和release编译结果在多线程的遇到的一个问题
- 利用暴力反编译的程序处理ArcXML数据遇到的问题小结(纯粹研究目的)
- POSIX多线程程序编译问题
- 交叉编译内核问题小结
- Boost并发编程(多线程)编译链接所遇到的问题
- linux c下多线程并发服务器GCC编译问题