initlize .db file of local dict in background thread.

This commit is contained in:
St.Huang 2018-07-08 22:05:36 +08:00
parent 760ae4a1b9
commit 9fa0ae6aba
2 changed files with 47 additions and 15 deletions

View File

@ -34,6 +34,8 @@ from collections import defaultdict
from functools import wraps from functools import wraps
import cookielib import cookielib
from aqt import mw
from aqt.qt import QThread, QMutex
from ..context import config from ..context import config
from ..libs import MdxBuilder, StardictBuilder from ..libs import MdxBuilder, StardictBuilder
from ..utils import MapDict, wrap_css from ..utils import MapDict, wrap_css
@ -142,6 +144,15 @@ def parseHtml(html):
return soup return soup
def service_wrap(service, *args, **kwargs):
"""
wrap the service class constructor
"""
def _service():
return service(*args, **kwargs)
return _service
class Service(object): class Service(object):
''' '''
Dictionary Service Abstract Class Dictionary Service Abstract Class
@ -390,6 +401,23 @@ class WebService(Service):
response_output.write(payload) response_output.write(payload)
# MdxBuilder instances map
mdx_builders = defaultdict(dict)
mutex_builder = QMutex()
class DictBuilder(QThread):
"""Local Dictionary Builder"""
def __init__(self, func):
super(DictBuilder, self).__init__()
self.index = 0
self.exit = False
self.builder = None
self.func = func
def run(self):
self.builder = self.func()
class LocalService(Service): class LocalService(Service):
""" """
Local Dictionary Service Local Dictionary Service
@ -400,6 +428,18 @@ class LocalService(Service):
self.dict_path = dict_path self.dict_path = dict_path
self.builder = None self.builder = None
self.missed_css = set() self.missed_css = set()
def get_builer(self, key, func):
mutex_builder.lock()
if not mdx_builders.has_key(key) or not mdx_builders[key]:
worker = DictBuilder(func)
worker.start()
while not worker.isFinished():
mw.app.processEvents()
worker.wait(100)
mdx_builders[key] = worker.builder
mutex_builder.unlock()
return mdx_builders[key]
@property @property
def support(self): def support(self):
@ -417,8 +457,6 @@ class LocalService(Service):
def _filename(self): def _filename(self):
return os.path.splitext(os.path.basename(self.dict_path))[0] return os.path.splitext(os.path.basename(self.dict_path))[0]
# MdxBuilder instances map
mdx_builders = defaultdict(dict)
class MdxService(LocalService): class MdxService(LocalService):
""" """
@ -433,9 +471,7 @@ class MdxService(LocalService):
self.query_interval = 0.01 self.query_interval = 0.01
self.styles = [] self.styles = []
if self.support: if self.support:
if not mdx_builders.has_key(dict_path) or not mdx_builders[dict_path]: self.builder = self.get_builer(dict_path, service_wrap(MdxBuilder, dict_path))
mdx_builders[dict_path] = MdxBuilder(dict_path)
self.builder = mdx_builders[dict_path]
@staticmethod @staticmethod
def check(dict_path): def check(dict_path):
@ -604,7 +640,11 @@ class StardictService(LocalService):
super(StardictService, self).__init__(dict_path) super(StardictService, self).__init__(dict_path)
self.query_interval = 0.05 self.query_interval = 0.05
if self.support: if self.support:
self.builder = StardictBuilder(self.dict_path, in_memory=False) self.builder = self.get_builer(
dict_path,
service_wrap(StardictBuilder, dict_path, in_memory=False)
)
#self.builder = StardictBuilder(self.dict_path, in_memory=False)
self.builder.get_header() self.builder.get_header()
@staticmethod @staticmethod

View File

@ -24,19 +24,11 @@ from functools import wraps
from aqt import mw from aqt import mw
from aqt.qt import QThread from aqt.qt import QThread
from aqt.utils import showInfo from aqt.utils import showInfo
from .base import LocalService, MdxService, StardictService, WebService from .base import LocalService, MdxService, StardictService, WebService, service_wrap
from ..context import config from ..context import config
from ..utils import MapDict, importlib from ..utils import MapDict, importlib
def service_wrap(service, *args):
"""
wrap the service class constructor
"""
def _service():
return service(*args)
return _service
class ServiceManager(object): class ServiceManager(object):
""" """
Query service class manager Query service class manager