#31 - Creating thread with callback, on pre_load(). /JL

This commit is contained in:
2025-03-28 17:26:58 +01:00
parent 1be429c5cd
commit 406c1b77ed
4 changed files with 16 additions and 15 deletions
+6 -1
View File
@@ -1,5 +1,9 @@
import time
from xtendr.xtendrsystem import XtendRSystem from xtendr.xtendrsystem import XtendRSystem
def my_callback():
print("'example_plugin is finished pre-loading")
if __name__ == "__main__": if __name__ == "__main__":
"""Example usage of the PluginSystem. """Example usage of the PluginSystem.
@@ -15,7 +19,8 @@ if __name__ == "__main__":
Detached plugin 'example_plugin'. Detached plugin 'example_plugin'.
""" """
system = XtendRSystem() system = XtendRSystem()
system.attach("example_plugin") # Assuming 'example_plugin/plugin_info.json' exists system.attach("example_plugin", my_callback) # Assuming 'example_plugin/plugin_info.json' exists
time.sleep(6)
system.run("example_plugin", test="Hello!") system.run("example_plugin", test="Hello!")
system.stop("example_plugin") system.stop("example_plugin")
system.run("example_plugin", 25) system.run("example_plugin", 25)
+4 -5
View File
@@ -1,4 +1,5 @@
import threading import threading
import time
from xtendr.xtendrbase import XtendRBase from xtendr.xtendrbase import XtendRBase
class ExamplePlugin(XtendRBase): class ExamplePlugin(XtendRBase):
@@ -14,9 +15,6 @@ class ExamplePlugin(XtendRBase):
>>> plugin.stop() >>> plugin.stop()
ExamplePlugin has stopped! ExamplePlugin has stopped!
""" """
self.pre_load_done = threading.Event()
self.use_pre_load:bool = False #Indicate that pre-loading isn't neccessary
def run(self, *args, **kwargs): def run(self, *args, **kwargs):
arglen = len(args) arglen = len(args)
keylen = len(kwargs) keylen = len(kwargs)
@@ -36,5 +34,6 @@ class ExamplePlugin(XtendRBase):
def stop(self): def stop(self):
print("ExamplePlugin has stopped!") print("ExamplePlugin has stopped!")
def pre_load(self): def pre_load(self, callback):
pass time.sleep(5) # Indicate long running pre-load.
callback()
+1 -1
View File
@@ -25,6 +25,6 @@ class XtendRBase(ABC):
pass pass
@abstractmethod @abstractmethod
def pre_load(self): def pre_load(self, *args):
pass pass
+5 -8
View File
@@ -5,7 +5,7 @@ import json
import threading import threading
from xtendr.xtendrbase import XtendRBase from xtendr.xtendrbase import XtendRBase
__version__ = "0.1.3" __version__ = "0.3.0"
class XtendRSystem: class XtendRSystem:
"""Plugin system to manage plugins. """Plugin system to manage plugins.
@@ -29,7 +29,7 @@ class XtendRSystem:
def version(self) -> str: def version(self) -> str:
return "XtendR v" + __version__ return "XtendR v" + __version__
def attach(self, name: str) -> None: def attach(self, name: str, callback) -> None:
"""Dynamically load a plugin from its folder.""" """Dynamically load a plugin from its folder."""
if name in self.plugins: if name in self.plugins:
print(f"Plugin '{name}' is already attached.") print(f"Plugin '{name}' is already attached.")
@@ -68,15 +68,12 @@ class XtendRSystem:
'autorun': False 'autorun': False
} }
print(f"Attached plugin '{name}'.") print(f"Attached plugin '{name}'.")
print(f"Running pre-load on '{name}'.")
thread = threading.Thread(target=self.plugins[name].pre_load(), args=(callback,))
thread.start()
except (ModuleNotFoundError, json.JSONDecodeError, AttributeError) as e: except (ModuleNotFoundError, json.JSONDecodeError, AttributeError) as e:
print(f"Failed to attach plugin '{name}': {e}") print(f"Failed to attach plugin '{name}': {e}")
def _pre_load(self, name: str):
"""Pre-load data if needed"""
if name in plugins:
if self.plugins[name].use_pre_load: # Is pre-loading neccessary?
threading.Thread(target=self.plugins[name].pre_load()).start()
def run(self, name: str, *args, **kwargs): def run(self, name: str, *args, **kwargs):
"""Run the plugin's 'run' method if available.""" """Run the plugin's 'run' method if available."""
if name in self.plugins: if name in self.plugins: