2016-03-03 2 views
0

Я работаю с Python UNO, используя «внутренний» (Libreoffice - это хост-процесс), где интерпретатор Python живет в Libreoffice/Openoffice. Я хотел бы сделать код неблокирующим ... то есть, когда код вызывается как макрос, он запускает второй поток и возвращает основной поток обратно в Office, чтобы он не блокировал пользовательский интерфейс, пока он продолжает запускать очень длительный процесс (время выполнения 10-20 минут).Python UNO и Threads

Когда я пробовал именно это, LibreOffice зависает навсегда. Я искал почти везде, но не как нечетную ссылку на импорт scipy во втором потоке, а затем блокировку, ожидая в этом потоке (myrhread.join()), похоже, что этого не происходит.

В качестве альтернативы можно создать новый ServiceManager, чтобы я мог вызвать второй процесс, а затем связать его обратно с ServiceManager, чтобы я мог вернуться обратно в LibreOffice обычным способом, не блокируя его «призрачной нитью» «?

+1

Добро пожаловать в StackOverflow! Пожалуйста, разместите упрощенную версию кода, который вы пробовали до сих пор, тот, который зависает. Несколько вопросов: вызывается ли код PyUNO в качестве макроса (например, «Инструменты -> Макросы -> Запустить макрос») или снаружи с помощью прослушивающего экземпляра? Кроме того, что делает длительный процесс - он модифицирует документ Writer или делает что-то снаружи, например, создает файл где-то еще в операционной системе? –

+0

Как указано выше, он вызывается как макрос (живет внутри процесса LibreOffice). Если бы это было снаружи, то нить не требовалась бы. Причина, по которой этот код медленный, заключается в том, что после экспериментов я обнаружил, что создание аннотации выполняется довольно медленно. Мне нужно вставить что-то вроде 1500 аннотаций ячеек. Без аннотаций он работает в секундах. –

ответ

2

После много копания, я нашел ответ здесь:

LibreOfficeForum Threading Example

Для простых длительных задач, где было бы в противном случае блокировать поток пользовательского интерфейса, это работает очень хорошо. Соответствующий код выглядит следующим образом:

 
from threading import Thread 
from time import sleep 
import uno 

t = None 

def test_worker(doc): 

    # Wait 30 seconds for demonstration purposes 
    sleep(30) 

    # Get the 1st sheet in the document and insert text into cell A1 
    doc.Sheets.getByIndex(0).getCellByPosition(0,0).String = "I'm back" 

def delayedRun(*args): 
    global t 
    doc = XSCRIPTCONTEXT.getDocument() 
    t = Thread(target = test_worker, args = (doc,)) 
    t.start() 

g_exportedScript = delayedRun, 
+1

Это хороший ответ. Я был бы рад помочь, но мне нужно было больше информации. В следующий раз, задав вопрос, пожалуйста, периодически проверяйте его, чтобы ответить на любые комментарии. –