mirror of
https://gitee.com/sui-feng-cb/AzurLaneAutoScript1
synced 2026-03-11 22:08:20 +08:00
@@ -1,5 +1,6 @@
|
||||
import argparse
|
||||
import queue
|
||||
import threading
|
||||
import time
|
||||
from datetime import datetime
|
||||
from typing import Dict, List
|
||||
@@ -19,7 +20,7 @@ from module.webui.process_manager import ProcessManager
|
||||
from module.webui.setting import Setting
|
||||
from module.webui.translate import translate
|
||||
from module.webui.updater import updater
|
||||
from module.webui.utils import (Icon, Switch, TaskHandler, Thread, add_css,
|
||||
from module.webui.utils import (Icon, Switch, TaskHandler, add_css,
|
||||
filepath_css, get_localstorage,
|
||||
get_window_visibility_state, login,
|
||||
parse_pin_value, raise_exception, re_fullmatch)
|
||||
@@ -843,13 +844,13 @@ class AlasGUI(Frame):
|
||||
self.show()
|
||||
|
||||
# detect config change
|
||||
_thread_wait_config_change = Thread(
|
||||
_thread_wait_config_change = threading.Thread(
|
||||
target=self._alas_thread_wait_config_change)
|
||||
register_thread(_thread_wait_config_change)
|
||||
_thread_wait_config_change.start()
|
||||
|
||||
# save config
|
||||
_thread_save_config = Thread(
|
||||
_thread_save_config = threading.Thread(
|
||||
target=self._alas_thread_update_config)
|
||||
register_thread(_thread_save_config)
|
||||
_thread_save_config.start()
|
||||
|
||||
@@ -8,7 +8,6 @@ from filelock import FileLock
|
||||
from module.config.utils import deep_get, filepath_config
|
||||
from module.logger import logger, set_file_logger, set_func_logger
|
||||
from module.webui.setting import Setting
|
||||
from module.webui.utils import Thread
|
||||
from rich.console import ConsoleRenderable
|
||||
|
||||
|
||||
@@ -23,7 +22,7 @@ class ProcessManager:
|
||||
self.renderables_max_length = 400
|
||||
self.renderables_reduce_length = 80
|
||||
self._process: Process = None
|
||||
self.thd_log_queue_handler: Thread = None
|
||||
self.thd_log_queue_handler: threading.Thread = None
|
||||
|
||||
def start(self, func: str, ev: threading.Event = None) -> None:
|
||||
if not self.alive:
|
||||
@@ -31,9 +30,14 @@ class ProcessManager:
|
||||
target=ProcessManager.run_process,
|
||||
args=(self.config_name, func, self._renderable_queue, ev,))
|
||||
self._process.start()
|
||||
self.thd_log_queue_handler = Thread(
|
||||
self.start_log_queue_handler()
|
||||
|
||||
def start_log_queue_handler(self):
|
||||
if self.thd_log_queue_handler is not None and self.thd_log_queue_handler.is_alive():
|
||||
return
|
||||
self.thd_log_queue_handler = threading.Thread(
|
||||
target=self._thread_log_queue_handler)
|
||||
self.thd_log_queue_handler.start()
|
||||
self.thd_log_queue_handler.start()
|
||||
|
||||
def stop(self) -> None:
|
||||
lock = FileLock(f"{filepath_config(self.config_name)}.lock")
|
||||
@@ -42,13 +46,15 @@ class ProcessManager:
|
||||
self._process.terminate()
|
||||
self.renderables.append(
|
||||
f"[{self.config_name}] exited. Reason: Manual stop\n")
|
||||
if self.thd_log_queue_handler is not None:
|
||||
self.thd_log_queue_handler.stop()
|
||||
self.thd_log_queue_handler.join()
|
||||
logger.info(f"[{self.config_name}] exited")
|
||||
|
||||
def _thread_log_queue_handler(self) -> None:
|
||||
while self.alive:
|
||||
log = self._renderable_queue.get()
|
||||
try:
|
||||
log = self._renderable_queue.get(timeout=1)
|
||||
except queue.Empty:
|
||||
continue
|
||||
self.renderables.append(log)
|
||||
if len(self.renderables) > self.renderables_max_length:
|
||||
self.renderables = self.renderables[self.renderables_reduce_length:]
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import ctypes
|
||||
import datetime
|
||||
import operator
|
||||
import re
|
||||
@@ -92,26 +91,6 @@ class QueueHandler:
|
||||
self.queue.put(s)
|
||||
|
||||
|
||||
class Thread(threading.Thread):
|
||||
# https://www.geeksforgeeks.org/python-different-ways-to-kill-a-thread/
|
||||
def _get_id(self):
|
||||
# returns id of the respective thread
|
||||
if hasattr(self, '_thread_id'):
|
||||
return self._thread_id
|
||||
for thd_id, thread in threading._active.items():
|
||||
if thread is self:
|
||||
return thd_id
|
||||
|
||||
def stop(self):
|
||||
if self.is_alive():
|
||||
thread_id = self._get_id()
|
||||
res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id,
|
||||
ctypes.py_object(SystemExit))
|
||||
if res > 1:
|
||||
ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0)
|
||||
logger.error('Exception raise failure')
|
||||
|
||||
|
||||
class Task:
|
||||
def __init__(self, g: Generator, delay: float, next_run: float = None, name: str = None) -> None:
|
||||
self.g = g
|
||||
@@ -141,7 +120,8 @@ class TaskHandler:
|
||||
# Running task
|
||||
self._task = None
|
||||
# Task running thread
|
||||
self._thread: Thread = None
|
||||
self._thread: threading.Thread = None
|
||||
self._alive = False
|
||||
self._lock = threading.Lock()
|
||||
|
||||
def add(self, func, delay: float, pending_delete: bool = False) -> None:
|
||||
@@ -215,7 +195,7 @@ class TaskHandler:
|
||||
Start task loop.
|
||||
You **should** run this function in an individual thread.
|
||||
"""
|
||||
while True:
|
||||
while self._alive:
|
||||
if self.tasks:
|
||||
with self._lock:
|
||||
self.tasks.sort(key=operator.attrgetter('next_run'))
|
||||
@@ -243,7 +223,7 @@ class TaskHandler:
|
||||
time.sleep(0.5)
|
||||
|
||||
def _get_thread(self) -> threading.Thread:
|
||||
thread = Thread(target=self.loop, daemon=True)
|
||||
thread = threading.Thread(target=self.loop, daemon=True)
|
||||
return thread
|
||||
|
||||
def start(self) -> None:
|
||||
@@ -259,8 +239,8 @@ class TaskHandler:
|
||||
|
||||
def stop(self) -> None:
|
||||
self.remove_pending_task()
|
||||
if self._thread.is_alive():
|
||||
self._thread.stop()
|
||||
self._alive = False
|
||||
self._thread.join()
|
||||
logger.info("Finish task handler")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user