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
 | 
				
			||||||
@ -401,6 +429,18 @@ class LocalService(Service):
 | 
				
			|||||||
        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):
 | 
				
			||||||
        return os.path.isfile(self.dict_path)
 | 
					        return os.path.isfile(self.dict_path)
 | 
				
			||||||
@ -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