From ab24d03d3fe4db499d1f87531fb6e34b9b84b01a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Wiesner?= Date: Fri, 27 Feb 2026 21:42:12 +0100 Subject: [PATCH] - threading/queueing implemented --- sync_client.py | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/sync_client.py b/sync_client.py index 2a62cf7..80a3736 100644 --- a/sync_client.py +++ b/sync_client.py @@ -3,7 +3,7 @@ import tkinter as tk from tkinter import ttk from tkinter import filedialog, messagebox from watchdog.observers import Observer -from watchdog.events import FileSystemEventHandler +from watchdog.events import FileSystemEvent, FileSystemEventHandler import os import requests import json @@ -21,13 +21,18 @@ class SyncClient: def start(self) -> None: _sself = self - self.__event_queue = queue.Queue() + self._event_queue = queue.Queue() - def comm_thread_routine(): - while True: - event = self.__event_queue.get() + def comm_thread_routine(queue: queue.Queue): + run = True + while run: + event: FileSystemEvent = queue.get() - rel_path = str(event.src_path).removeprefix(_sself.dir()) + if event.src_path == "**CLOSE**" and event.is_synthetic == True: + run = False + continue + + rel_path = str(event.src_path).removeprefix(_sself.dir()).removeprefix(os.sep) if event.event_type == "created" or event.event_type == "modified": _sself.upload(rel_path) elif event.event_type == "moved": @@ -46,9 +51,10 @@ class SyncClient: def on_any_event(self, event): if event.event_type in FileChangeHandler.EVENTS_WATCHED: if event.src_path != _sself.dir(): - _sself.__event_queue.put(event) + _sself._event_queue.put(event) - self.__comm_thread = threading.Thread() + self.__comm_thread = threading.Thread(target=comm_thread_routine, args=(self._event_queue,)) + self.__comm_thread.start() observer = Observer() event_handler = FileChangeHandler() @@ -65,10 +71,8 @@ class SyncClient: self.__key = key self.__comm_thread: threading.Thread - self.__event_queue: queue.Queue - - self.start() - + self._event_queue: queue.Queue + def dir(self) -> str: return self.__dir @@ -159,6 +163,9 @@ class SyncClient: def close(self) -> None: self.__observer.stop() + self._event_queue.put(FileSystemEvent("**CLOSE**", is_synthetic=True)) + self.__comm_thread.join() + return def upload_all(self) -> None: @@ -327,8 +334,9 @@ class SyncClientGui: def on_close(): self.__save_settings() - self.__win.destroy() self.stop_sync() + self.__win.destroy() + self.__win.protocol("WM_DELETE_WINDOW", on_close) @@ -352,6 +360,7 @@ class SyncClientGui: def mainloop(self) -> None: self.__win.mainloop() + return # ------------------