initlize .db file of local dict in background thread.
This commit is contained in:
parent
760ae4a1b9
commit
9fa0ae6aba
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user