improve thread stability
This commit is contained in:
parent
b44d1f4bf5
commit
70b5f73308
@ -31,7 +31,7 @@ from aqt.utils import showInfo, showText, tooltip
|
||||
from .constants import Endpoint, Template
|
||||
from .context import config
|
||||
from .lang import _, _sl
|
||||
from .progress import ProgressManager
|
||||
from .progress import ProgressWindow
|
||||
from .service import service_manager, QueryResult, copy_static_file
|
||||
from .utils import Empty, MapDict, Queue, wrap_css
|
||||
|
||||
@ -66,8 +66,7 @@ class QueryThread(QThread):
|
||||
"""
|
||||
Query Worker Thread
|
||||
"""
|
||||
|
||||
progress_update = pyqtSignal(dict)
|
||||
|
||||
note_flush = pyqtSignal(object)
|
||||
|
||||
def __init__(self, manager):
|
||||
@ -75,12 +74,11 @@ class QueryThread(QThread):
|
||||
self.index = 0
|
||||
self.exit = False
|
||||
self.manager = manager
|
||||
self.progress_update.connect(progress.update_labels)
|
||||
self.note_flush.connect(handle_flush)
|
||||
self.note_flush.connect(manager.handle_flush)
|
||||
|
||||
def run(self):
|
||||
while True:
|
||||
if progress.abort() or self.exit or self.manager == None:
|
||||
if self.exit or not self.manager:
|
||||
break
|
||||
try:
|
||||
note = self.manager.queue.get(True, timeout=0.1)
|
||||
@ -90,20 +88,14 @@ class QueryThread(QThread):
|
||||
|
||||
try:
|
||||
results, success_num = query_all_flds(note)
|
||||
if self.manager:
|
||||
if not self.exit and self.manager:
|
||||
if self.manager.update(note, results, success_num):
|
||||
self.note_flush.emit(note)
|
||||
# Update progress window infomation
|
||||
self.progress_update.emit(
|
||||
MapDict(
|
||||
type='count',
|
||||
words_number = self.manager.counter,
|
||||
fails_number = self.manager.fails,
|
||||
fields_number = self.manager.fields)
|
||||
)
|
||||
|
||||
self.note_flush.emit(note)
|
||||
except InvalidWordException:
|
||||
showInfo(_("NO_QUERY_WORD"))
|
||||
|
||||
if self.manager:
|
||||
self.manager.queue.task_done()
|
||||
|
||||
|
||||
class QueryWorkerManager(object):
|
||||
@ -115,8 +107,10 @@ class QueryWorkerManager(object):
|
||||
self.workers = []
|
||||
self.queue = Queue()
|
||||
self.mutex = QMutex()
|
||||
self.progress = ProgressWindow(mw)
|
||||
self.total = 0
|
||||
self.counter = 0
|
||||
self.fails = 0
|
||||
self.fields = 0
|
||||
|
||||
def get_worker(self):
|
||||
@ -126,29 +120,13 @@ class QueryWorkerManager(object):
|
||||
return worker
|
||||
|
||||
def start(self):
|
||||
for x in range(0, min(config.thread_number, self.queue.qsize())):
|
||||
self.total = self.queue.qsize()
|
||||
self.progress.start(self.total, min=0)
|
||||
for x in range(0, min(config.thread_number, self.total)):
|
||||
self.get_worker()
|
||||
|
||||
self.total = self.queue.qsize()
|
||||
for worker in self.workers:
|
||||
worker.start()
|
||||
|
||||
def reset(self):
|
||||
for worker in self.workers:
|
||||
worker.exit = True
|
||||
worker.manager = None
|
||||
worker.terminate()
|
||||
|
||||
self.mutex.unlock()
|
||||
self.workers = []
|
||||
self.queue = Queue()
|
||||
self.total = 0
|
||||
self.counter = 0
|
||||
self.fails = 0
|
||||
self.fields = 0
|
||||
|
||||
def clean(self):
|
||||
self.reset()
|
||||
|
||||
def update(self, note, results, success_num):
|
||||
self.mutex.lock()
|
||||
@ -164,16 +142,23 @@ class QueryWorkerManager(object):
|
||||
def join(self):
|
||||
for worker in self.workers:
|
||||
while not worker.isFinished():
|
||||
if progress.abort():
|
||||
if self.progress.abort():
|
||||
worker.exit = True
|
||||
break
|
||||
else:
|
||||
self.progress.update_labels(MapDict(
|
||||
type='count',
|
||||
words_number = self.counter,
|
||||
fails_number = self.fails,
|
||||
fields_number = self.fields))
|
||||
mw.app.processEvents()
|
||||
worker.wait(100)
|
||||
|
||||
|
||||
@pyqtSlot(object)
|
||||
def handle_flush(note):
|
||||
if note:
|
||||
note.flush()
|
||||
self.progress.finish()
|
||||
|
||||
@pyqtSlot(object)
|
||||
def handle_flush(self, note):
|
||||
if note:
|
||||
note.flush()
|
||||
|
||||
|
||||
def query_from_browser(browser):
|
||||
@ -192,7 +177,7 @@ def query_from_browser(browser):
|
||||
return
|
||||
|
||||
query_all(notes)
|
||||
browser.model.reset()
|
||||
# browser.model.reset()
|
||||
|
||||
|
||||
def query_from_editor_all_fields(editor):
|
||||
@ -204,7 +189,7 @@ def query_from_editor_all_fields(editor):
|
||||
return
|
||||
|
||||
query_all([editor.note])
|
||||
editor.setNote(editor.note, focus=True)
|
||||
#editor.setNote(editor.note, focus=True)
|
||||
editor.saveNow()
|
||||
|
||||
|
||||
@ -216,8 +201,9 @@ def query_all(notes):
|
||||
if len(notes) == 0:
|
||||
return
|
||||
|
||||
work_manager.reset()
|
||||
progress.start(max=len(notes), min=0, immediate=True)
|
||||
work_manager = QueryWorkerManager()
|
||||
#work_manager.reset()
|
||||
#progress.start(max=len(notes), min=0, immediate=True)
|
||||
queue = work_manager.queue
|
||||
|
||||
for i, note in enumerate(notes):
|
||||
@ -226,11 +212,11 @@ def query_all(notes):
|
||||
work_manager.start()
|
||||
work_manager.join()
|
||||
|
||||
progress.finish()
|
||||
#progress.finish()
|
||||
promot_choose_css()
|
||||
tooltip(u'{0} {1} {2}, {3} {4}'.format(_('UPDATED'), work_manager.counter, _('CARDS'), work_manager.fields, _('FIELDS')))
|
||||
work_manager.clean()
|
||||
service_pool.clean();
|
||||
#work_manager.clean()
|
||||
service_pool.clean()
|
||||
|
||||
|
||||
def update_note_fields(note, results):
|
||||
@ -322,7 +308,7 @@ def query_all_flds(note):
|
||||
if not word:
|
||||
raise InvalidWordException
|
||||
|
||||
progress.update_title(u'Querying [[ %s ]]' % word)
|
||||
# progress.update_title(u'Querying [[ %s ]]' % word)
|
||||
|
||||
services = {}
|
||||
tasks = []
|
||||
@ -387,8 +373,6 @@ class ServicePool(object):
|
||||
|
||||
def clean(self):
|
||||
self.pools = {}
|
||||
|
||||
|
||||
progress = ProgressManager(mw) # progress window
|
||||
work_manager = QueryWorkerManager() # Query Worker Thread Manager
|
||||
|
||||
service_pool = ServicePool() # Service Instance Pool Manager
|
||||
|
||||
Loading…
Reference in New Issue
Block a user