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(): def start():
# Creating admin sight # Creating admin sight
#sights.create("sight-admin", "sight-admin") sights.create("sight-admin", "sight-admin")
#sights.show("sight-admin") sights.show("sight-admin")
# Creating the main Sight # Creating the main Sight
sights.create("main", data["default_template_page"]) sights.create("main", data["default_template_page"])

View File

@ -9,19 +9,13 @@ class Broadcast:
if base.registrar.checkData(record) is not None: if base.registrar.checkData(record) is not None:
for sight in base.sights.getSights().values(): for sight in base.sights.getSights().values():
if len(record.getHeader().getReceivers()) == 0: if len(record.getHeader().getReceivers()) == 0:
"""sight.browser.page().runJavaScript("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData( print("EVERY ID " + str(sight.getPageId()))
True) + "')", self.ready)""" sight.addJob("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData(
sight.js_worker.addRequest("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData( True) + "')", sight.getPageId())
True) + "')") elif sight.getPageId() in record.getHeader().getReceivers():
else: print("ID " + str(sight.getPageId()))
if sight.getPageId() in record.getHeader().getReceivers(): sight.addJob("receiveData('" + record.getHeader().getType() + "', '" + record.getHeader().getReferralName() + "', '" + record.getData(
print("ID " +str(sight.getId())) True) + "')", sight.getPageId())
"""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: else:
print("Couldnt send message") 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 import base
from core.sight.threads.jsrun_worker import JsRunWorker
from callhandler import CallHandler from callhandler import CallHandler
from browser import Browser from browser import Browser
from PyQt6.QtCore import Qt from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QMainWindow, QWidget, QVBoxLayout 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 import time
class Sight(QWidget): class Sight(QWidget):
js_work_requested = Signal(str)
def __init__(self, id, page): def __init__(self, id, page):
super().__init__() super().__init__()
@ -17,7 +18,7 @@ class Sight(QWidget):
self.data = {} # private data(s) of the sight self.data = {} # private data(s) of the sight
self.children = [] self.children = []
self.parent = None self.parent = None
self.js_worker = self.JsRunWorker() self.pool = QThreadPool.globalInstance()
base.data["active_sight"] = self.id base.data["active_sight"] = self.id
self.title = id self.title = id
@ -42,27 +43,25 @@ class Sight(QWidget):
self.setLayout(self.layout) 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): def runJs(self,request_js):
self.browser.page().runJavaScript(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) # use when the frameSupported is False (for instance wayland)
def closeEvent(self, event): def closeEvent(self, event):
self.js_worker.dont_work() self.pool.clear()
self.js_worker_thread.quit()
base.sights.close(self.id) base.sights.close(self.id)
@ -102,40 +101,4 @@ class Sight(QWidget):
def getData(self, key): def getData(self, key):
if key in self.data: if key in self.data:
return self.data[key] return self.data[key]
return None 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)

View File

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