- threading/queueing implemented

This commit is contained in:
András Wiesner 2026-02-27 21:42:12 +01:00
parent 9aeafdfc9e
commit ab24d03d3f

View File

@ -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
# ------------------