C 窗體切換 避免開啟多個執行緒

2022-04-10 13:12:22 字數 2217 閱讀 3344

先說說這個多窗體的介面的解決的辦法:

用到的方法很簡單,就是程式執行就建立乙個mainform,在這個mainform中設立乙個panel,同時設立幾個按鈕,按下每個按鈕都在這個panel中載入不同的窗體,這樣就解決了多窗體的切換。

在panel的子窗體可以通過設定form的formborderstyle為none,去掉它的最大化最小化和關閉按鈕。但是一旦設定這個屬性就必須手動的呼叫這個窗體的close方法來關閉這個窗體,因為呼叫這個方法和滑鼠點選窗體的x按鈕是一樣的效果,都會呼叫窗體的close函式。同時這個函式的呼叫也會觸發窗體的formclosing等事件。

下面看一下第一次寫的**:

//mainform的**

public class robotarrounding : form

private void btnmonitor_click(object sender, eventargs e)

curselect = 0;

} private void btnplane_click(object sender, eventargs e)

curselect = 1;

} private void btnhistorychecking_click(object sender, eventargs e)

curselect = 2;

} private void bntexit_click(object sender, eventargs e)

}

**很簡單,每次點選按鈕都new乙個新的窗體並顯示。但是後來發現這樣有問題,那就是多次按按鈕,切換介面以後,原本new出來的窗體並沒有銷毀,沒有被垃圾**器收回。而是在整個程式退出的時候才呼叫了窗體的close方法,驗證的方法就是在每乙個窗體中增加formclosing事件,驗證這個事件觸發的時間,**:

//其中的乙個介面的類

public partial class checkingplane : form

private void checkingplane_formclosing(object sender, formclosingeventargs e)

}

解決的辦法:

如果乙個窗體沒有被要求顯示,那麼這個窗體就不用new乙個例項,如果這個窗體要求顯示,那麼就new乙個窗體的例項,然後一直保持乙個窗體的單例模式,直到整個程式退出時才銷毀這個窗體。

public partial class robotarrounding : form

private void btnmonitor_click(object sender, eventargs e)

else

selectfrm[curselect].hide();

selectfrm[0].show();

this.pnlmain.controls.add(selectfrm[0]);

} curselect = 0;

} private void btnplane_click(object sender, eventargs e)

else

selectfrm[curselect].hide();

selectfrm[1].show();

this.pnlmain.controls.add(selectfrm[1]);

} curselect = 1;

} private void btnhistorychecking_click(object sender, eventargs e)

else

selectfrm[curselect].hide();

selectfrm[2].show();

this.pnlmain.controls.add(selectfrm[2]);

} curselect = 2;

} private void bntexit_click(object sender, eventargs e)

}this.close();

}}

這樣寫還有乙個小的問題,那就是我自己的繼承自form的窗體類,如果有自己定義的函式,利用多型訪問這個窗體的時候就不能訪問到這個函式。其實這個也很簡單,在需要訪問子類自定義的函式的時候,強制轉換一下型別就可以了。

這樣一來,不管你切換多少次窗體,都只有乙個窗體的例項了,這樣就能防止new很多的窗體例項了。

C 實現多個子窗體切換

1.設定mdi主選單的mdiwindowlistitem 顯示子視窗的選單tsmiwindow,這樣開啟的子窗體標題將自動顯示在window選單下 private void tsmiwindownext click object sender,eventargs e else private voi...

QT 多個窗體切換(一)

1 widget 1主窗體轉至widget 2附窗體 1 建立窗體widget 1,並新建qt介面窗體widget 2,介面中加入轉換窗體widget 2的按鈕,建立widget 1的槽連線 2 窗體widget 1.件中加入窗體widget 2.h的標頭檔案,widget 1標頭檔案中建立widg...

springboot 開啟多個執行緒

介紹 一些介面操作可以畢竟費時,而tomact執行緒的數量又是有限的,想要提高web吞吐量可以在spring裡開啟非同步。spring預設的執行緒是有限的 反正預設的不太好之類的 需要自己手工配置個執行緒池效果會更好。configuration enableasync 開啟對非同步任務的支援 pub...