The runJs thread fixed and every sight use own threadpool where in their thread runs without interrupt eachother.

main
Balazs Birtalan 2023-11-13 19:32:09 +00:00
parent 3169d1cf14
commit 2430db8be2
5 changed files with 57 additions and 71 deletions

View File

@ -81,8 +81,8 @@ def loadConfigTemplate():
def start():
# Creating admin sight
#sights.create("sight-admin", "sight-admin")
#sights.show("sight-admin")
sights.create("sight-admin", "sight-admin")
sights.show("sight-admin")
# Creating the main Sight
sights.create("main", data["default_template_page"])

View File

@ -9,19 +9,13 @@ class Broadcast:
if base.registrar.checkData(record) is not None:
for sight in base.sights.getSights().values():
if len(record.getHeader().getReceivers()) == 0:
"""sight.browser.page().runJavaScript("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData(
True) + "')", self.ready)"""
sight.js_worker.addRequest("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData(
True) + "')")
else:
if sight.getPageId() in record.getHeader().getReceivers():
print("ID " +str(sight.getId()))
"""sight.browser.page().runJavaScript(
"receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData(
True) + "')", self.ready)"""
sight.js_worker.addRequest(
"receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData(
True) + "')")
print("EVERY ID " + str(sight.getPageId()))
sight.addJob("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData(
True) + "')", sight.getPageId())
elif sight.getPageId() in record.getHeader().getReceivers():
print("ID " + str(sight.getPageId()))
sight.addJob("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData(
True) + "')", sight.getPageId())
else:
print("Couldnt send message")

View File

@ -0,0 +1,24 @@
import time
from PyQt6.QtCore import QRunnable, QObject, QThreadPool, pyqtSignal as Signal, pyqtSlot as Slot
import base
class Signals(QObject):
started = Signal(str)
jsrun = Signal(str)
completed = Signal(str)
class JsRunWorker(QRunnable):
def __init__(self, js_script, page_id):
super().__init__()
self.page_id = page_id
self.js_script = js_script
self.signals = Signals()
@Slot()
def run(self):
self.signals.started.emit(self.page_id)
time.sleep(0.5)
#print("PAGE ID is " + str(self.page_id) + " - " + self.js_script)
self.signals.jsrun.emit(self.js_script)
self.signals.completed.emit(self.page_id)

View File

@ -1,13 +1,14 @@
import base
from core.sight.threads.jsrun_worker import JsRunWorker
from callhandler import CallHandler
from browser import Browser
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QMainWindow, QWidget, QVBoxLayout
from PyQt6.QtCore import QThread, QObject, pyqtSignal as Signal, pyqtSlot as Slot
from PyQt6.QtCore import QThread,QThreadPool, QObject, pyqtSignal as Signal, pyqtSlot as Slot
from queue import Queue
import time
class Sight(QWidget):
js_work_requested = Signal(str)
def __init__(self, id, page):
super().__init__()
@ -17,7 +18,7 @@ class Sight(QWidget):
self.data = {} # private data(s) of the sight
self.children = []
self.parent = None
self.js_worker = self.JsRunWorker()
self.pool = QThreadPool.globalInstance()
base.data["active_sight"] = self.id
self.title = id
@ -42,27 +43,25 @@ class Sight(QWidget):
self.setLayout(self.layout)
def addJob(self, js_script, page_id):
worker = JsRunWorker(js_script, page_id)
worker.signals.completed.connect(self.complete)
worker.signals.jsrun.connect(self.runJs)
worker.signals.started.connect(self.start)
self.pool.start(worker)
def start(self, n):
print(f'Job in "{n}" page started...')
def complete(self, n):
print(f'Job in "{n}" page completed.')
def runJs(self,request_js):
self.browser.page().runJavaScript(request_js)
def st(self):
self.js_worker_thread = QThread()
self.js_worker.js_run.connect(self.runJs)
self.js_work_requested.connect(self.js_worker.do_work)
# move worker to the worker thread
self.js_worker.moveToThread(self.js_worker_thread)
# start the thread
self.js_worker_thread.start()
self.js_work_requested.emit(self.page)
# use when the frameSupported is False (for instance wayland)
def closeEvent(self, event):
self.js_worker.dont_work()
self.js_worker_thread.quit()
self.pool.clear()
base.sights.close(self.id)
@ -102,40 +101,4 @@ class Sight(QWidget):
def getData(self, key):
if key in self.data:
return self.data[key]
return None
class JsRunWorker(QObject):
__js_requests = []
__infinitive = True
js_run = Signal(str)
def addRequest(self, js):
self.__js_requests.append(js)
#print("REQUESTS: ")
#print(self.__js_requests)
@Slot(str)
def do_work(self, name):
sec_sleep = 0.5
while self.__infinitive:
rs = self.__js_requests
self.__js_requests.clear()
time.sleep(sec_sleep)
for request in rs:
time.sleep(sec_sleep)
print(name + " " +request)
try:
self.js_run.emit(request)
except Exception as error:
print("Error " + str(error))
#break
# self.__js_requests.remove(request)
# base.sights.get(page).browser.page().runJavaScript("receiveData('message', 'logs', {'event_code':'do_work', 'msg':'test', 'date':'ye'})", self.ready)
def dont_work(self):
self.__infinitive = False
def ready(self, returnValue):
if returnValue is not None:
print(returnValue)
return None

View File

@ -4,11 +4,17 @@ import json
import random
from sight import Sight
class SightFactory():
__job_jsrun = None
def __init__(self):
self.list = {}
self.data = {} #Global data(s) for the sight(s)
def addJsJob(self, script, page_id):
self.__job_jsrun.addJob(script,page_id)
def create(self, id, page):
log.byCode("SF1000E","The page '" + str(page) + "' with '"+str(id)+"' id.")
if str(id) == "main" and self.checkKey(id):
@ -40,7 +46,6 @@ class SightFactory():
if self.checkKey(id):
self.list[id].show()
log.byCode("SF1000E","The '"+str(id)+"' sight is showed!")
self.list[id].st()
return True
log.byCode("SF1001W", "This '"+str(id)+"' id isn't exist to show!")
return False