1.问题描述
伪代码如下:
QEventLoop eventLoop;
QObject::connect(this, &Class::signal, [](){
doSomething();
eventLoop.exit(0);
});
emit signal();
eventLoop.exec();
在执行eventLoop.exec()时,造成永不退出。
2.原因分析
本打算在,槽函数中执行doSomething()后,再继续执行。但是在signal发出后,先执行了槽函数中的exit(0)函数,后面的eventLoop.exec()随后执行,但此时已经没有exit()来终止eventLoop了,造成后面的代码永远也不会执行。
切记:在exec()后再执行exit()!
本文分析了一段使用Qt的信号槽机制的伪代码中出现的死锁问题,指出在signal发出后,由于exit(0)函数的提前执行导致后续的eventLoop.exec()无法正常退出。文章强调了在调用exec()后才应执行exit()的重要性。
1万+

被折叠的 条评论
为什么被折叠?



