2020年11月22日 星期日

如何在AEDT訊息視窗顯示正確的計算進度

在AEDT編寫自動化程式,我們會習慣在程式碼當中利用AddWarningMessage()來顯示進度。一開始的進度顯示正常,但是到後段顯示會中斷,直到完成計算訊息視窗才會一口氣將後段的所有訊息一次列出來。這就失去了進度顯示的意義。比方說下面一段程式碼到了60%,訊息視窗就停止更新,等到全部計算完畢才一次將70%-100%訊息列印出來:

oDesktop.ClearMessages('', '', 2)
import time

t0 = time.time()
result = []
for i in range(10):
data = []

for j in range(i, i + 1000000):
data.append(j)
x = sum(data)
AddWarningMessage('{}\n'.format(x))
AddWarningMessage('{}%\n'.format((i + 1) * 10))
result.append(str(x))

AddWarningMessage(str(result))
AddWarningMessage(str(time.time() - t0) + '(secs)')

我們可以透過Threading的方式解決這個問題,訊息視窗會按照正常的進度輸出訊息:

oDesktop.ClearMessages('', '', 2)
import time
import threading

t0 = time.time()

def func(x, result):
data = []

for j in range(x, x + 1000000):
data.append(j)
x = sum(data)
AddWarningMessage('{}\n'.format(x))
result.append(str(x))

result = []
for i in range(10):
t = threading.Thread(target=func, args=(i, result))
t.start()
t.join()
AddWarningMessage('{}%\n'.format((i + 1) * 10))

AddWarningMessage(str(result))
AddWarningMessage(str(time.time() - t0) + '(secs)')
(圖一) 顯示計算進度


沒有留言:

張貼留言