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,
Другие вопросы по тегам