none
mdi 子 Form 關閉問題 RRS feed

  • 問題

  • 我有寫一個  MDI  開了一個子Form  這個子form 裡面會起thread

    我關閉時  若有thread 沒關 就會  關不掉這個子 form

    所以我想了一個 方法把 開的thread 加到arraylist 中

    在 form closing 時 去關掉 還 alive 的thread

    但  使用者 那邊 有可能 因為 加入太多的thread 到 arraylist中   造成  outofmemory

    我想請問一下 有沒有辦法直接 強迫關掉這個  MDI 子form 包含其 thread

    而不影響 主 MDI Form

    2010年4月20日 上午 09:12

解答

  • Hi,

    您的updateData做了哪些事?

    更新的資料怎摸傳進UserControl內的?

    更新時是否有會到主執行緒去更新?

    建議評估一下Thread數是否太多...

    也許改用ThreadPool去做

    讓它幫您管理Thread數量會比較好

    ThreadPool 類別

    http://msdn.microsoft.com/zh-tw/library/system.threading.threadpool(VS.95).aspx

     

    另外一提,之前您發的討論應該就已經有建議不要一昧的只靠多執行緒去加速

    但架構上看起來您的程式還是一樣

    執行緒並不是造越多越快、越多越好

    免不了還是要做些架構上的調整


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 布利 2010年4月22日 上午 07:40
    2010年4月21日 上午 10:23
  • 為什麼報價不斷進來, arraylist就會一直變大, 你給的Code實在有限, 完全就是供大家瞎猜而已.

    我想這應該是之前討論有說過的

    他的程式運算很龐大

    要運算一陣子

    但是股價卻是一直進來

    變成進來的速度比消耗的速度還快


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/

     

    如果是這樣的情形

    我的作法是用一個清單去接、用另一個線程去跑、跑完在抓下一個、或是抓最後一個、其他丟掉

    • 已標示為解答 布利 2010年4月22日 上午 07:41
    2010年4月22日 上午 07:31

所有回覆

  • IsBackground 設為 true
    • 已提議為解答 Larry Nung(蹂躪)MVP 2010年4月20日 上午 10:09
    • 已標示為解答 布利 2010年4月21日 上午 04:48
    • 已取消標示為解答 布利 2010年4月22日 上午 07:40
    2010年4月20日 上午 09:15
  • IsBackground 設為 true


    你是指 把 每個thread 設為 IsBackgroud=true ;    嘛?

    我有設耶  可是 還是 有時候在關閉時  mdi 子 form 會整個  凍結住

    AP 就當掉了

    有辦法知道   關閉時  還有哪些thread 在執行嘛 

    我有用arraylist add 進來 結果  因為 太多了  outofmemory 

    真的很需要  各位大大的幫忙

    2010年4月20日 上午 11:51
  • 你用 Arraylist將Thread的參考指標加進來, 當它關閉時應該也要從清單中移除吧 ?

    發問的內容沒有提到重點:

    1. 會開出多少 Mdi Child Form ?

    2. 每個 Mdi Child From 在程式產生多少個Thread執行個體 ?

    3. 如何傳遞參考指標給 Mdi Parent Form 來加入arraylist中 ?

    4. 關鍵處的程式碼.

    5. 錯誤訊息的內容及其發生在那一段程式碼中 ?

    你們不能老是說: 需要幫忙

    卻又總提供猜燈謎式的資料, 這樣要讓大家猜到什麼時候 ? 這怪不得我們幫不上忙, 因為根本從你提供的資料中根本完全使不上力.

     


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 布利 2010年4月21日 上午 04:48
    • 已取消標示為解答 布利 2010年4月22日 上午 07:40
    2010年4月20日 下午 12:03
    版主
  • Hi,

    把問題描述清楚,並把關鍵的CODE貼出

    這樣才能知道為何會要像您提到的這樣做

    另外也很好奇為何要那摸多執行緒

    如果像您提到的會記憶體不足

    那可能您用的執行緒也太多了


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年4月20日 下午 02:31
  • Hi,

    把問題描述清楚,並把關鍵的CODE貼出

    這樣才能知道為何會要像您提到的這樣做

    另外也很好奇為何要那摸多執行緒

    如果像您提到的會記憶體不足

    那可能您用的執行緒也太多了


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/

    謝謝各位大大的指教

    我從頭說起  希望能寫的明白 

    1.  我有一個MDI form 可以開啟一個 子form

         而此 form 的構成   是會在這個 子form 上  依照呼叫的參數

         ex:  frmMonitor m_frm=new frmMonitor("xxx,zz,qq");

               xxx      zz    qq

               就代表三個商品 我會在 子form 上去貼上 相對應的 三個  usercontrol 的元件

         而這個子form 會去收外部的行情報價Event   例如 : 股價

    2.   會了要更新 usercontrol 的內容

         我的usercontrol 會有 一個 method 給外部去呼叫 已更新usercontrol 的內容

         ex  :  ucl  m_ucl=new m_ucl();

                 m_ucl.updateData();    //  此段是當報價event 進來時就會去呼叫更新

    3.  起初 我的寫法是   Thread m_thread=new Thread(new ThreadStart(m_ucl.updateData));

                                  m_thread.start();

        但  在關閉時  有時會  凍結整個程式掛點

    4.  後來 我再加上  m_thread.IsBackground=true;

         結果 還是有時會有問題 

    5. 後來 想想  乾脆把  thread 都存起來  然後 在 form_closing 時去abort 它

       於是就寫了一個 g_thread_AL 的arraylist 去把 thread都擺進去

       當關閉時  當然 就跑回圈  讓  在 arraylist 中的 thread 若是 alive==true 就關掉

       一切都很正常

    6. 結果  意外發生了  因為  使用者  從開盤到收盤  報價不斷進來  造成  arraylist 過大  發生 outofmemory

       這時  我就想了  當  thread 執行完時  就做這個動作

       g_thread_AL.remove(Thread.currentThread);

       g_thread_AL.trimToSize();

       過了  十幾分鐘  使用者 打來 反應  還是  outofmemory

    7. 這時 我先把  arraylist 拿掉  先看看 還會不會 outofmemory

        但這時就必須面對 這個 form 可能會關不起來的問題

        以上是我的說明

    若還是不夠詳盡  請見諒

     

     

    2010年4月20日 下午 03:37
  • 1.

    private static Thread runTeamSave;

     if (runTeamSave != null && runTeamSave.IsAlive) { runTeamSave.Abort(); }

    2.

    重複使用

     if (TeamData.isRunSave)
     {
           if (runTeamSave != null && runTeamSave.IsAlive) { runTeamSave.Abort(); }
           runTeamSave = null;
           runTeamSave = new Thread(new ThreadStart(TeamData.SaveTick));
           runTeamSave.Start();
      }                   

    2010年4月21日 上午 07:25
  • Hi,

    您的updateData做了哪些事?

    更新的資料怎摸傳進UserControl內的?

    更新時是否有會到主執行緒去更新?

    建議評估一下Thread數是否太多...

    也許改用ThreadPool去做

    讓它幫您管理Thread數量會比較好

    ThreadPool 類別

    http://msdn.microsoft.com/zh-tw/library/system.threading.threadpool(VS.95).aspx

     

    另外一提,之前您發的討論應該就已經有建議不要一昧的只靠多執行緒去加速

    但架構上看起來您的程式還是一樣

    執行緒並不是造越多越快、越多越好

    免不了還是要做些架構上的調整


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 布利 2010年4月22日 上午 07:40
    2010年4月21日 上午 10:23
  • Hi,

    您的updateData做了哪些事?

    更新的資料怎摸傳進UserControl內的?

    更新時是否有會到主執行緒去更新?

    建議評估一下Thread數是否太多...

    也許改用ThreadPool去做

    讓它幫您管理Thread數量會比較好

    ThreadPool 類別

    http://msdn.microsoft.com/zh-tw/library/system.threading.threadpool(VS.95).aspx

     

    另外一提,之前您發的討論應該就已經有建議不要一昧的只靠多執行緒去加速

    但架構上看起來您的程式還是一樣

    執行緒並不是造越多越快、越多越好

    免不了還是要做些架構上的調整


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/


    感謝您的回答

    其實  我有檢討過我的架構  目前另外一個案子 用threadpool 很順利 再次謝謝您

     

    這次  真的  很困擾

    您需要的資訊

    1.  我 是由  MDI 開了一個子form 在這個子form 裡會有一個Event 去接 報價 資料

        我把這個子form 上的usercontrol  擺在一個  Hashtable中

        UserControl 中有一個 update的method會去更新  usercontrol 中的 dataGridView資料

        然後  當event 一接到資料  就起一個thread 是由  子form 去起的thread 然後擺在  arrayList 中

    2. 這個案子 我也有用 ThreadPool 去試 結果  那個子form 也會發生  關不起來的現像

    然後 run  久一點 就出現 outofmemory

     

     

    2010年4月21日 上午 11:57
  • 你該不會是不斷地產生m_ucl類別的執行個體, 但通通都沒有釋放吧

    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月21日 下午 12:53
    版主
  • 你該不會是不斷地產生m_ucl類別的執行個體, 但通通都沒有釋放吧

    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上


    我看了程式  沒有這樣的現像

    子From 會依照傳入  參數  建立  usercontrol

    就不會再有程式碼有建立 usercontrol 的時候

    2010年4月21日 下午 12:58
  • 6. 結果  意外發生了  因為  使用者  從開盤到收盤  報價不斷進來  造成  arraylist 過大  發生 outofmemory

       這時  我就想了  當  thread 執行完時  就做這個動作

       g_thread_AL.remove(Thread.currentThread);

       g_thread_AL.trimToSize();

       過了  十幾分鐘  使用者 打來 反應  還是  outofmemory

     

    為什麼報價不斷進來, arraylist就會一直變大, 你給的Code實在有限, 完全就是供大家瞎猜而已.

    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月21日 下午 01:16
    版主
  • 為什麼報價不斷進來, arraylist就會一直變大, 你給的Code實在有限, 完全就是供大家瞎猜而已.

    我想這應該是之前討論有說過的

    他的程式運算很龐大

    要運算一陣子

    但是股價卻是一直進來

    變成進來的速度比消耗的速度還快


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年4月21日 下午 02:18
  • 為什麼報價不斷進來, arraylist就會一直變大, 你給的Code實在有限, 完全就是供大家瞎猜而已.

    我想這應該是之前討論有說過的

    他的程式運算很龐大

    要運算一陣子

    但是股價卻是一直進來

    變成進來的速度比消耗的速度還快


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/

     

    如果是這樣的情形

    我的作法是用一個清單去接、用另一個線程去跑、跑完在抓下一個、或是抓最後一個、其他丟掉

    • 已標示為解答 布利 2010年4月22日 上午 07:41
    2010年4月22日 上午 07:31