diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index 9f1ce4a78c..5d6bb52d5d 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -35,6 +35,7 @@ Assistant::Assistant(AsstApiCallback callback, void* callback_arg) m_status = std::make_shared(); m_ctrler = std::make_shared(task_callback, static_cast(this)); + m_ctrler->set_exit_flag(&m_thread_idle); m_working_thread = std::thread(&Assistant::working_proc, this); m_msg_thread = std::thread(&Assistant::msg_proc, this); diff --git a/src/MeoAssistant/Controller.cpp b/src/MeoAssistant/Controller.cpp index fde49cefca..d9bb07cb67 100644 --- a/src/MeoAssistant/Controller.cpp +++ b/src/MeoAssistant/Controller.cpp @@ -212,6 +212,11 @@ std::pair asst::Controller::get_scale_size() const noexcept return m_scale_size; } +bool asst::Controller::need_exit() const +{ + return m_exit_flag != nullptr && *m_exit_flag; +} + void asst::Controller::pipe_working_proc() { LogTraceFunction; @@ -377,6 +382,9 @@ std::optional> asst::Controller::call_command(const std::stri }} }; constexpr static int ReconnectTimes = 20; for (int i = 0; i < ReconnectTimes; ++i) { + if (need_exit()) { + break; + } reconnect_info["details"]["times"] = i; m_callback(AsstMsg::ConnectionInfo, reconnect_info, m_callback_arg); @@ -540,6 +548,9 @@ std::optional asst::Controller::try_to_init_socket(const std::st u_short max_port = try_port + try_times; for (u_short port = try_port; port < max_port; ++port) { + if (need_exit()) { + break; + } Log.trace("try to bind port", port); #ifdef _WIN32 @@ -1202,6 +1213,9 @@ bool asst::Controller::inited() const noexcept return m_inited; } +void asst::Controller::set_exit_flag(bool* flag) +{} + const std::string& asst::Controller::get_uuid() const { return m_uuid; @@ -1218,6 +1232,9 @@ cv::Mat asst::Controller::get_image(bool raw) constexpr static int MaxTryCount = 20; bool success = false; for (int i = 0; i < MaxTryCount && m_inited; ++i) { + if (need_exit()) { + break; + } if (screencap()) { success = true; break; diff --git a/src/MeoAssistant/Controller.h b/src/MeoAssistant/Controller.h index b5f80c143a..bd64de8031 100644 --- a/src/MeoAssistant/Controller.h +++ b/src/MeoAssistant/Controller.h @@ -35,6 +35,7 @@ namespace asst bool connect(const std::string& adb_path, const std::string& address, const std::string& config); bool release(); bool inited() const noexcept; + void set_exit_flag(bool* flag); const std::string& get_uuid() const; cv::Mat get_image(bool raw = false); @@ -66,6 +67,7 @@ namespace asst Controller& operator=(Controller&&) = delete; private: + bool need_exit() const; void pipe_working_proc(); std::optional> call_command(const std::string& cmd, int64_t timeout = 20000, bool recv_by_socket = false); int push_cmd(const std::string& cmd); @@ -86,6 +88,7 @@ namespace asst // 转换data中所有的crlf为lf:有些模拟器自带的adb,exec-out输出的\n,会被替换成\r\n,导致解码错误,所以这里转一下回来(点名批评mumu) static void convert_lf(std::vector& data); + bool* m_exit_flag = nullptr; AsstCallback m_callback; void* m_callback_arg = nullptr;