From 044c4f55b8c8024c2a0ce41baa033bc09c139ed0 Mon Sep 17 00:00:00 2001 From: zzyyyl Date: Wed, 21 Sep 2022 15:25:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9F=90=E4=BA=9B?= =?UTF-8?q?=E6=83=85=E5=86=B5=E4=B8=8B=E7=82=B9=E5=87=BB=E5=81=9C=E6=AD=A2?= =?UTF-8?q?=E5=90=8E=E9=87=8D=E8=BF=9E=E6=97=B6=E9=97=B4=E5=BE=88=E9=95=BF?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/MeoAssistant/Controller.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index 8e24484616..6b09575a3b 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -274,6 +274,7 @@ std::optional asst::Controller::call_command(const std::string& cmd } if (wait_handles.empty()) break; auto elapsed = steady_clock::now() - start_time; + // TODO: 这里目前是隔 5000ms 判断一次,应该可以加一个 wait_handle 来判断外部中断(need_exit) auto wait_time = (std::min)(timeout - duration_cast(elapsed).count(), process_running ? 5LL * 1000 : 0LL); if (wait_time < 0) break; @@ -419,6 +420,11 @@ std::optional asst::Controller::call_command(const std::string& cmd if (!pipe_data.empty() && pipe_data.size() < 4096) { Log.trace("output:", Logger::separator::newline, pipe_data); } + // 直接 return,避免走到下面的 else if 里的 set_inited(false) 关闭 adb 连接, + // 导致停止后再开始任务还需要重连一次 + if (need_exit()) { + return std::nullopt; + } if (!exit_ret) { return recv_by_socket ? sock_data : pipe_data; @@ -443,12 +449,15 @@ std::optional asst::Controller::call_command(const std::string& cmd reconnect_info["details"]["times"] = i; callback(AsstMsg::ConnectionInfo, reconnect_info); - // TODO: 应该有外部中断 sleep 的写法吧?现在只能在开始或者结束 sleep 的时候判断( + // TODO: 也许 WIN32 可以用 WaitForSingleObjectEx 做一个允许外部打断的 sleep std::this_thread::sleep_for(10s); if (need_exit()) { break; } auto reconnect_ret = call_command(m_adb.connect, 60LL * 1000, false, false /* 禁止重连避免无限递归 */); + if (need_exit()) { + break; + } bool is_reconnect_success = false; if (reconnect_ret) { auto& reconnect_str = reconnect_ret.value();