模態窗口
(ShowDialog)彈出窗口阻止調用窗口的所有消息響應。
只有在彈出窗口結束后調用窗口才能繼續。
在模態窗口“關閉”后,窗口並沒有真正被“關閉”,“關閉”按鈕並沒有調用窗體的Close方法,只是將窗體的Visible屬性賦值為false,隱藏了窗體,所以模態窗口在不需要用的時候,務必手動Dispose釋放窗體資源,雖然.Net會定時執行垃圾回收,但是何時執行垃圾回收並不受控制,當模態窗口關閉后窗體資源沒有及時手動釋放時,其他相關操作可能會引起線程阻塞導致程序假死。模態窗口資源釋放后仍然能在當前函數塊中讀取模態窗口中信息,包括窗口的返回狀態,窗口子控件的值。
非模態窗口
(Show)可以在彈出窗口和調用窗口之間隨意切換。
調用窗口調用show方法后,下面的代碼可以立即執行。
在非模態窗口關閉時,Close方法會馬上調用Dispose釋放資源,此時對象還沒有被銷毀,仍然能在代碼中通過窗口實例獲取窗口中的信息。
使用模態窗口未及時手動釋放導致主線程阻塞:
以Halcon的HWindowControl控件為例,在窗口A中實例化一個HWindowControl控件,窗口B中實例化一個HWindowControl控件,在A窗口通過ShowDialog調用B窗口,然后關閉B窗口(如此反復2~3次),接着在A窗口的HWindowControl控件上執行DrawRectangle1等繪制操作的話,很容易就阻塞主線程,導致程序假死;所以B窗口在不需要使用時務必及時手動Dispose釋放窗體資源,切記切記!!!
