• 4626阅读
  • 7回复

connect(timer,SIGNAL(timeout()),&loop,SLOT(quit()));是什么用途 [复制链接]

上一主题 下一主题
离线岭南小菜
 

只看楼主 倒序阅读 楼主  发表于: 2019-04-28
void Reader::socketReadyRead(){    QEventLoop loop;    QTimer timer;    connect(&timer,SIGNAL(timeout()),&loop,SLOT(quit()));    timer.start(50);    loop.exec();    QByteArray reply(socket->readAll());    readLine(reply);}请问上面代码是什么意思?从字面意思来看,启动定时器,每50ms执行一次QEventLoop 的quit槽函数。这个什么含义呢?这个函数的功能是,socket发送指后,读取server的返回数据。为什么要每50ms执行一次QEventLoop 的quit槽函数。如果把上面的代码注释掉,socket读取的数据不完整,不知道上面代码的精髓,还请大家指教!!!!!
离线青空飞羽

只看该作者 1楼 发表于: 2019-04-28
整体用途就是: 延迟等待50ms接收socket上的数据
QEventLoop 事件循环,loop.exec()执行后会阻塞程序,50ms后定时器事件触发调用loop.quit退出事件循环,程序继续往后执行,接收socket上的数据。
1条评分金钱+3
岭南小菜 金钱 +3 - 2019-04-28
离线岭南小菜

只看该作者 2楼 发表于: 2019-04-28
回 青空飞羽 的帖子
青空飞羽:整体用途就是: 延迟等待50ms接收socket上的数据
QEventLoop 事件循环,loop.exec()执行后会阻塞程序,50ms后定时器事件触发调用loop.quit退出事件循环,程序继续往后执行,接收socket上的数据。 (2019-04-28 14:02) 

把上面的注释掉,接收的数据不完整,这个怎么理解?
离线青空飞羽

只看该作者 3楼 发表于: 2019-04-28
回 岭南小菜 的帖子
岭南小菜:把上面的注释掉,接收的数据不完整,这个怎么理解? (2019-04-28 14:37) 

那可能是发送端数据还没发送完全,所以接收端需要延迟等待50ms保证数据完整
离线岭南小菜

只看该作者 4楼 发表于: 2019-04-28
谢谢你的回复。
离线liulin188

只看该作者 5楼 发表于: 2019-04-28
我一直有个以为,QEventLoop 在用于实现异步阻塞的时候,
exec()会不会后执行呢,

https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线stlcours

只看该作者 6楼 发表于: 2019-05-02
这个其实是武林秘籍,不小心被你看到了,祝愿楼主早日练成葵花宝典
在线fsu0413

只看该作者 7楼 发表于: 2019-05-23
这逻辑很诡异啊
QAbstractSocket有waitForReadyRead函数的,如果怕收到数据不完整的话,循环Wait啊
快速回复
限100 字节
 
上一个 下一个