Revit 二次開發之多執行緒
阿新 • • 發佈:2019-02-16
原先開發外掛時沒有注意到模態和非模態對話方塊在Revit中的區別,直到最近做了一個專案,需要啟動事務對Revit資料進行修改,在視窗為模態對話方塊中沒有問題,但是變成非模態對話時則出現錯誤,大意是無法在API內容外啟動事務等等,其實質就是Revit對多執行緒支援的問題,不能在除外掛主執行緒外的其他執行緒中對Revit資料進行修改,好了問題已經定位了,下一步就是解決問題,按照以往解決問題的思路,先去SDK中的Sample中找找看有沒有相關事例,發現了正好說明此問題的Demo(ModelessDialog), 參考研究改寫程式碼後問題得到解決,解決問題的核心思路是使用事件機制,將Revit資料修改這部分功能挪動到事件處理函式中,主執行緒中監聽並處理事件,子執行緒則控制事件的觸發目的和觸發時機, 目前Revit針對多執行緒提供了兩種事件可供使用,一種是ExternalEvent,另外一種是IdlingEvent,下面詳細說說它們。
1:ExternalEvent
Revit提供的外部事件機制,使用者在主執行緒中建立一個外部事件,主執行緒會輪詢監聽該事件,子執行緒中使用該事件物件主動觸發事件,主執行緒監聽到後,就會主動呼叫事先註冊好的Handler中的事件處理函式。
2:IdlingEvent
Revit中的UIControlledApplication物件提供的可供註冊的空閒事件,會被Revit不定期自動觸發,亦即主執行緒會不定期呼叫其對應的事件處理函式。
參考的SDK Demo:SDK\Samples\ModelessDialog