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
import cookielib
from aqt import mw
from aqt.qt import QThread, QMutex
from ..context import config
from ..libs import MdxBuilder, StardictBuilder
from ..utils import MapDict, wrap_css
@ -142,6 +144,15 @@ def parseHtml(html):
return soup
def service_wrap(service, *args, **kwargs):
"""
wrap the service class constructor
"""
def _service():
return service(*args, **kwargs)
return _service
class Service(object):
'''
Dictionary Service Abstract Class
@ -390,6 +401,23 @@ class WebService(Service):
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):
"""
Local Dictionary Service
@ -401,6 +429,18 @@ class LocalService(Service):
self.builder = None
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
def support(self):
return os.path.isfile(self.dict_path)
@ -417,8 +457,6 @@ class LocalService(Service):
def _filename(self):
return os.path.splitext(os.path.basename(self.dict_path))[0]
# MdxBuilder instances map
mdx_builders = defaultdict(dict)
class MdxService(LocalService):
"""
@ -433,9 +471,7 @@ class MdxService(LocalService):
self.query_interval = 0.01
self.styles = []
if self.support:
if not mdx_builders.has_key(dict_path) or not mdx_builders[dict_path]:
mdx_builders[dict_path] = MdxBuilder(dict_path)
self.builder = mdx_builders[dict_path]
self.builder = self.get_builer(dict_path, service_wrap(MdxBuilder, dict_path))
@staticmethod
def check(dict_path):
@ -604,7 +640,11 @@ class StardictService(LocalService):
super(StardictService, self).__init__(dict_path)
self.query_interval = 0.05
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()
@staticmethod

View File

@ -24,19 +24,11 @@ from functools import wraps
from aqt import mw
from aqt.qt import QThread
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 ..utils import MapDict, importlib
def service_wrap(service, *args):
"""
wrap the service class constructor
"""
def _service():
return service(*args)
return _service
class ServiceManager(object):
"""
Query service class manager