none
請問該如何透過FormA關閉FormB RRS feed

  • 問題

  • 小弟撰寫了一支程式,該程式是由FormB產生出一個FormA,接下來當 按下FormA右上角的"叉"時,整支程式就應該執行關閉的動作,小弟本來是打算透過FormB的close事件來執行,但卻造成了跨執行緒的問題產生 ,所以想請問版上的前輩是否有什麼正確的方法呢?
    2009年1月31日 上午 06:40

解答

  • 如果是用 ShowDialog 的方式開啟 FormA,那麼在 FormA 結束之後,回到 FormB,由 FormB 結束程式即可。
    若是以 Show 的方式開啟 FormA,想要在任何地方結束應用程式,可試試 Application.Exit()。但你並未提供有關「跨執行緒的問題」的相關資訊和錯誤訊息,所以這個方法不見得能夠解決您的問題。



    http://huan-lin.blogspot.com/
    • 已標示為解答 shanon 2009年2月1日 上午 05:43
    2009年1月31日 下午 01:00

所有回覆

  • 如果是用 ShowDialog 的方式開啟 FormA,那麼在 FormA 結束之後,回到 FormB,由 FormB 結束程式即可。
    若是以 Show 的方式開啟 FormA,想要在任何地方結束應用程式,可試試 Application.Exit()。但你並未提供有關「跨執行緒的問題」的相關資訊和錯誤訊息,所以這個方法不見得能夠解決您的問題。



    http://huan-lin.blogspot.com/
    • 已標示為解答 shanon 2009年2月1日 上午 05:43
    2009年1月31日 下午 01:00
  •  Michael Tsai 大你好,使用application.exit()確實可以獲得解決,小弟感謝您的解答。另外關於「跨執行緒的問題」,我遇到的情況是出現"跨執行緒作業無效: 存取控制項 'menuStrip1' 時所使用的執行緒與建立控制項的執行緒不同",出現的位置是在base.Dispose(disposing) menuStrip1這個控制項是屬於FormB上的元件,而執行Close()方法的也是FormB,請問能否請教這究竟是什麼樣的情況呢?
    2009年2月1日 上午 05:41
  • 跨執行緒作業無效: 存取控制項 'menuStrip1' 時所使用的執行緒與建立控制項的執行緒不同」這個錯誤訊息的發生原因,解釋起來可長可短,簡單地說,就如訊息中所說的,是因為你在程式中存取 menuStrip1 的程式碼,執行時並不是在原本建立 menuStrip1 的執行緒。換言之,你用 thread1 建立了 menuStrip1,卻在 thread2 中存取 menuStrip1。

    我猜想你可能是用 modeless 的方式(Form.Show 方法)開啟 FormA,卻在 FormA 中存取 FormB 的 Windows 控制項(或相反),沒看到你的程式碼,所以我只能這樣猜測。用 modeless 的方式開新視窗時,該視窗會有另外一個訊息迴圈,即另一條執行緒。

    詳細的原因這裡要說明恐怕有點難,我重貼了一篇幾年前在雜誌上發表的一篇文章:<Windows 表單與多執行緒>,如有興趣追根究底,不妨參考看看。網路上應該也能找到解釋其背後原理的文章。

    http://huan-lin.blogspot.com/
    2009年2月1日 上午 08:41