一、坑的现象
多次调用QEventLoop,嵌套使用后,与预期中的返回顺序不一样
二、遇坑的原因
QEventLoop多次嵌套调用后,遵循先进先后出的原则,如果使用QEventLoop做一些同步操作去获取数据,可能会"阻塞",这个"阻塞"不会导致界面卡顿或者qt线程的阻塞,所以很难发现
三、示例如下:
void Widget::sltTestLoop()
{
//当前调用顺序值
int nIndex = m_nCurIndex++;
//构建一个eventLoop,来阻塞3s
QEventLoop eventLoop;
QTimer::singleShot(1000, [&eventLoop](){
eventLoop.quit();
});
eventLoop.exec();
qDebug() << nIndex;
}
void Widget::on_pushButton_clicked()
{
sltTestLoop();
}
上述按钮连续点击5次后,打印的内容分别是:
5
4
3
2
1