Русское сообщество Sublime Text

Основной раздел => Вопросы и ответы => Тема начата: lol481 от Марта 31, 2016, 01:58:38

Название: Как правильно запустить плагин в отдельном потоке?
Отправлено: lol481 от Марта 31, 2016, 01:58:38
Написал плагин для анализа C кода, но оказалось что на больших проектах он долго выполняется и тем самым каждый раз на несколько секунд блокирует GUI Sublime Text.
Теперь я пытаюсь сделать так что бы часть этого плагина работала в фоне. Но возникла проблема: при попытке выполнить часть кода, которая принимает как аргумент объект "edit" я получаю ошибку и код дальше не исполняется. Приведённый ниже код выполняется до строки "ui.output_panel_clear(self.edit)":

import threading
class MainClanglinterCommand(sublime_plugin.TextCommand):
def run(self, edit):
clanglinter_thread = ClanglinterThread(edit)
clanglinter_thread.start()


class ClanglinterThread(threading.Thread):
def __init__(self, edit):
self.edit = edit
threading.Thread.__init__(self)

def run(self):
settings.update()
if settings.get('enable'):
context.update()
analyzed_file_content = utils.get_view_content(context.get('view'))
temp_file_object = utils.create_temp_file()
utils.write_temp_file(temp_file_object, analyzed_file_content)

cmd = utils.get_full_cmd(settings.get('clanglinter_cmd'),
temp_file_object.name,
settings.get('project_settings'))

clang_output = utils.clang_launch(cmd)

parser.update(clang_output)
parser_output = parser.get_format_output()

ui.regions_clear()
if parser_output:
ui.regions_create()
ui.output_panel_clear(self.edit)
ui.output_panel_insert_lines(self.edit, parser_output)
ui.output_panel_show()
else:
ui.output_panel_clear(self.edit)
ui.output_panel_hide()

В консоль Sublime Text при попытке выполнения плагина теперь выводится:
Exception in thread Thread-3:
Traceback (most recent call last):
  File "./threading.py", line 901, in _bootstrap_inner
  File "C:\Program Files (x86)\sublimetext\sublimetext\Data\Packages\ClangLinter\ClangLinter.py", line 109, in run
    ui.output_panel_clear(self.edit)
  File "C:\Program Files (x86)\sublimetext\sublimetext\Data\Packages\ClangLinter\ClangLinter.py", line 414, in output_panel_clear
    view.erase(edit, sublime.Region(0, view.size()))
  File "C:\Program Files (x86)\sublimetext\sublimetext\sublime.py", line 701, in erase
    raise ValueError("Edit objects may not be used after the TextCommand's run method has returned")
ValueError: Edit objects may not be used after the TextCommand's run method has returned

Вопрос: как правильно передать в thread объект "edit"? Или что я делаю не так?