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();

posted @ 2025-06-27 15:37  一夜求风  阅读(56)  评论(0)    收藏  举报