QT编程问题小结(编译、多线程、UDP Socket等)

1. 编译问题(error 127)

如果计算机中配置了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]

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值