Python UNO и темы
Я работаю с Python UNO, используя "внутреннюю" (Libreoffice - хост-процесс) версию, в которой интерпретатор Python находится в Libreoffice/Openoffice. Я хотел бы сделать код неблокирующим... то есть когда код вызывается как макрос, он запускает второй поток и возвращает основной поток обратно в Office, чтобы он не блокировал пользовательский интерфейс, пока он продолжает работать длительный процесс (10-20 минут).
Когда я попробовал именно это, LibreOffice зависает навсегда. Я искал практически везде, но кроме странной ссылки на импорт scipy во второй поток и затем блокировку во время ожидания в этом потоке (myrhread.join()), похоже, нигде это не сделано.
В качестве альтернативы, возможно ли создать новый ServiceManager, чтобы я мог вызвать второй процесс и затем связать его с ServiceManager, чтобы я мог вернуться обратно к LibreOffice обычным способом, не блокируя его "потоком-призраком"?
1 ответ
После долгих раскопок я нашел ответ здесь:
Пример многопоточности LibreOfficeForum
Для простых длительных задач, в которых иначе блокируется поток пользовательского интерфейса, это работает очень хорошо. Соответствующий код выглядит следующим образом:
из ниток импорт ниток из времени импортировать сон импорт uno t = нет def test_worker (doc): # Подождите 30 секунд для демонстрационных целей сон (30) # Получить 1-й лист в документе и вставить текст в ячейку A1 doc.Sheets.getByIndex(0).getCellByPosition(0,0).String = "Я вернулся" def delayedRun (* args): глобальный т doc = XSCRIPTCONTEXT.getDocument () t = Thread (target = test_worker, args = (doc,)) t.start () g_exportedScript = delayedRun,