feat: 为controller添加退出标记

fix https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/1277
This commit is contained in:
MistEO
2022-08-20 02:40:03 +08:00
parent 1cab74cd84
commit b47a458b08
3 changed files with 21 additions and 0 deletions

View File

@@ -35,6 +35,7 @@ Assistant::Assistant(AsstApiCallback callback, void* callback_arg)
m_status = std::make_shared<RuntimeStatus>();
m_ctrler = std::make_shared<Controller>(task_callback, static_cast<void*>(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);

View File

@@ -212,6 +212,11 @@ std::pair<int, int> 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<std::vector<uchar>> 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<unsigned short> 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;

View File

@@ -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<std::vector<uchar>> 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有些模拟器自带的adbexec-out输出的\n会被替换成\r\n导致解码错误所以这里转一下回来点名批评mumu
static void convert_lf(std::vector<uchar>& data);
bool* m_exit_flag = nullptr;
AsstCallback m_callback;
void* m_callback_arg = nullptr;