#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

View File

@@ -1,5 +1,9 @@
import time
from xtendr.xtendrsystem import XtendRSystem
def my_callback():
print("'example_plugin is finished pre-loading")
if __name__ == "__main__":
"""Example usage of the PluginSystem.
@@ -15,7 +19,8 @@ if __name__ == "__main__":
Detached plugin 'example_plugin'.
"""
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.stop("example_plugin")
system.run("example_plugin", 25)

View File

@@ -1,4 +1,5 @@
import threading
import time
from xtendr.xtendrbase import XtendRBase
class ExamplePlugin(XtendRBase):
@@ -14,9 +15,6 @@ class ExamplePlugin(XtendRBase):
>>> plugin.stop()
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):
arglen = len(args)
keylen = len(kwargs)
@@ -36,5 +34,6 @@ class ExamplePlugin(XtendRBase):
def stop(self):
print("ExamplePlugin has stopped!")
def pre_load(self):
pass
def pre_load(self, callback):
time.sleep(5) # Indicate long running pre-load.
callback()

View File

@@ -25,6 +25,6 @@ class XtendRBase(ABC):
pass
@abstractmethod
def pre_load(self):
def pre_load(self, *args):
pass

View File

@@ -5,7 +5,7 @@ import json
import threading
from xtendr.xtendrbase import XtendRBase
__version__ = "0.1.3"
__version__ = "0.3.0"
class XtendRSystem:
"""Plugin system to manage plugins.
@@ -29,7 +29,7 @@ class XtendRSystem:
def version(self) -> str:
return "XtendR v" + __version__
def attach(self, name: str) -> None:
def attach(self, name: str, callback) -> None:
"""Dynamically load a plugin from its folder."""
if name in self.plugins:
print(f"Plugin '{name}' is already attached.")
@@ -68,15 +68,12 @@ class XtendRSystem:
'autorun': False
}
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:
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):
"""Run the plugin's 'run' method if available."""
if name in self.plugins: