QEventloop使用不当导致程序没有立马异常,而是在后续执行中出现页面卡死,程序崩溃的问题记录
为实现异步操作同步等待,需要使用QEventLoop实现
connect(blclient, &BluetoothClient::sigDiscoveryFinished, &loop, &QEventLoop::quit); blclient->conectToMower(blmac);
result = true;
// 使用 QTimer::singleShot 设置超时
QTimer::singleShot(5000, [&loop, &result]() {
// 5秒后超时 loop.quit();
// 退出事件循环 }
LOG_INFO("connect ble timeout");
result = true; });
存在重复调用loop.quit导致程序再后续流程中崩溃的问题,改进一下。
QEventLoop loop;
bool isFinished = false;
// 连接信号到事件循环的quit槽
connect(blclient, &BluetoothClient::sigDiscoveryFinished, [&loop, &isFinished]() {
if (!isFinished) {
isFinished = true;
loop.quit();
}
});
blclient->conectToMower(blmac);
result = true;
// 使用 QTimer::singleShot 设置超时
QTimer::singleShot(5000, [&loop, &isFinished, &result]() { // 5秒后超时
if (!isFinished) {
LOG_INFO("connect ble timeout");
result = false; // 设置结果为失败
loop.quit(); // 退出事件循环
}
});
loop.exec();

浙公网安备 33010602011771号