2016-03-03 78 views
0

我正在使用Python解釋器位於Libreoffice/Openoffice內部的「內部」(Libreoffice是宿主進程)版本的Python UNO。我想讓代碼非阻塞......即一旦代碼被調用爲宏,它會啓動第二個線程,並將主線程返回到Office,以便它不會阻止UI,同時繼續運行非常冗長的過程(10-20分鐘執行時間)。Python UNO和線程

當我嘗試這個,LibreOffice永遠凍結。我搜索了幾乎所有地方,但除了在第二個線程中導入scipy的奇怪引用,然後在等待該線程時阻塞(myrhread.join()),似乎沒有這樣做。

另外,是否有可能創建一個新的ServiceManager,以便我可以調用第二個進程,然後鏈接回ServiceManager,以便以正常方式返回到LibreOffice而不用「鎖定」 「?

+1

您好,歡迎來到StackOverflow!請發佈迄今爲止已嘗試的代碼的簡化版本,即凍結的代碼。幾個問題:PyUNO代碼是否被調用爲一個宏(例如'Tools - > Macros - > Run Macro'),或者使用監聽實例從外部調用?此外,漫長的過程完成了什麼 - 它是修改Writer文檔還是在外面做某些事情,例如在操作系統的其他地方創建文件? –

+0

如上所述,它被調用爲宏(住在LibreOffice進程內)。如果它在外面,那麼線程就不是必需的。代碼慢的原因是我在實驗後發現創建註釋非常慢。我需要插入1500個單元格註釋。沒有註釋,它會在幾秒鐘內運行。 –

回答

2

大量挖掘後,我找到了答案在這裏:

LibreOfficeForum Threading Example

對於簡單的長時間運行的任務哪裏會以其他方式阻止UI線程,這個作品非常好。相關代碼如下:

 
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

這是一個很好的答案。我會很樂意提供幫助,但我需要更多信息。下一次提問後,請定期檢查以解決任何問題。 –