fix(ai-studio): keep worker thread alive until finished
This commit is contained in:
@@ -274,6 +274,7 @@ class ImageStudioTab(QWidget):
|
||||
self.selected_source_asset_id = None
|
||||
self._running_worker = None
|
||||
self._running_thread = None
|
||||
self._worker_error_handled = False
|
||||
self._download_open_after = {}
|
||||
|
||||
self._build_ui()
|
||||
@@ -603,9 +604,6 @@ class ImageStudioTab(QWidget):
|
||||
def pull_main_images(self, checked=False):
|
||||
alias = str(self.account_combo.currentData() or "").strip()
|
||||
item_id = self.item_id_edit.text().strip()
|
||||
if self.current_project is not None:
|
||||
alias = self.current_project.account_alias
|
||||
item_id = self.current_project.item_id
|
||||
if not alias or not item_id:
|
||||
self._message("项目未打开", "请先选择账号和商品ID并打开项目。")
|
||||
return
|
||||
@@ -622,9 +620,7 @@ class ImageStudioTab(QWidget):
|
||||
self._append_log("[AI工场] 拉取主图开始")
|
||||
|
||||
def _on_pull_finished(self, summary):
|
||||
if summary.get("ok") is False:
|
||||
if self._running_worker is not None:
|
||||
self._on_worker_failed(-1, summary.get("error") or "拉取主图失败")
|
||||
if self._handle_finished_error(summary, "拉取主图失败"):
|
||||
return
|
||||
project = summary.get("project")
|
||||
if project is not None:
|
||||
@@ -871,9 +867,7 @@ class ImageStudioTab(QWidget):
|
||||
self._start_worker(worker, "AI工场下载原图")
|
||||
|
||||
def _on_download_finished(self, summary):
|
||||
if summary.get("ok") is False:
|
||||
if self._running_worker is not None:
|
||||
self._on_worker_failed(-1, summary.get("error") or "下载原图失败")
|
||||
if self._handle_finished_error(summary, "下载原图失败"):
|
||||
return
|
||||
asset = summary.get("asset")
|
||||
self._finish_worker()
|
||||
@@ -1153,9 +1147,7 @@ class ImageStudioTab(QWidget):
|
||||
return None
|
||||
|
||||
def _on_export_finished(self, summary):
|
||||
if summary.get("ok") is False:
|
||||
if self._running_worker is not None:
|
||||
self._on_worker_failed(-1, summary.get("error") or "导出终选失败")
|
||||
if self._handle_finished_error(summary, "导出终选失败"):
|
||||
return
|
||||
self._finish_worker()
|
||||
target_dir = summary.get("target_dir") or ""
|
||||
@@ -1196,9 +1188,7 @@ class ImageStudioTab(QWidget):
|
||||
self.billing_label.setText(text)
|
||||
|
||||
def _on_generation_finished(self, summary):
|
||||
if summary.get("ok") is False:
|
||||
if self._running_worker is not None:
|
||||
self._on_worker_failed(-1, summary.get("error") or "AI工场生成失败")
|
||||
if self._handle_finished_error(summary, "AI工场生成失败"):
|
||||
return
|
||||
self._finish_worker()
|
||||
self.refresh_project_assets()
|
||||
@@ -1211,6 +1201,9 @@ class ImageStudioTab(QWidget):
|
||||
self._status(f"AI工场生成完成:成功{success},失败{failed},停止{cancelled}", level)
|
||||
|
||||
def _on_worker_failed(self, row, error):
|
||||
if self._worker_error_handled:
|
||||
return
|
||||
self._worker_error_handled = True
|
||||
self._finish_worker()
|
||||
message = diagnostics.redact_log_text(str(error or "未知错误"))
|
||||
self._append_log(f"[AI工场] 失败:{message}")
|
||||
@@ -1218,16 +1211,30 @@ class ImageStudioTab(QWidget):
|
||||
self._message("AI工场任务失败", message)
|
||||
self.refresh_project_assets()
|
||||
|
||||
def _handle_finished_error(self, summary, fallback_message):
|
||||
if summary.get("ok") is not False:
|
||||
return False
|
||||
if not self._worker_error_handled:
|
||||
self._on_worker_failed(-1, summary.get("error") or fallback_message)
|
||||
return True
|
||||
|
||||
def _start_worker(self, worker, thread_name):
|
||||
self._set_running(True)
|
||||
thread = run_worker(worker, thread_name=thread_name, start=False)
|
||||
thread.finished.connect(lambda: self._forget_running_thread(thread))
|
||||
self._running_worker = worker
|
||||
self._running_thread = run_worker(worker, thread_name)
|
||||
self._running_thread = thread
|
||||
self._worker_error_handled = False
|
||||
self._set_running(True)
|
||||
thread.start()
|
||||
|
||||
def _finish_worker(self):
|
||||
self._running_worker = None
|
||||
self._running_thread = None
|
||||
self._set_running(False)
|
||||
|
||||
def _forget_running_thread(self, thread):
|
||||
if self._running_thread is thread:
|
||||
self._running_thread = None
|
||||
self._running_worker = None
|
||||
|
||||
def _set_running(self, running):
|
||||
self.open_project_button.setEnabled(not running)
|
||||
self.pull_images_button.setEnabled(not running)
|
||||
|
||||
Reference in New Issue
Block a user