none
讓執行緒執行的副程式去Call負責啟動執行緒的副程式,一直重複會造成什麼問題? RRS feed

  • 問題

  • 作業系統:Windows XP SP3
    使用語言:Visual Basic 2008
    問題內容:
        Private myThread As Thread
    
        Sub Main()
            Call Hello()
        End Sub
    
        Sub Hello()
            myThread = New Thread(AddressOf HowAreYou)
            myThread.Start()
        End Sub
    
        Sub HowAreYou()
            Thread.Sleep(1000)
            Call Hello()
        End Sub
    請問我在Main呼叫Hello()後,Hello()會建立新的執行緒執行HowAreYou(),
    但如果我又在HowAreYou()裡面呼叫Hello()的話,如此重複會造成什麼負擔或現象?


    另外HowAreYou()又呼叫Hello()時,此時HowAreYou()並未結束(Exit Sub),
    然後又在Hello()中建構新的執行緒,這樣原來HowAreYou()那個執行緒還沒結束吧?
    等於說,我每Call Hello()時,是不是系統就多一個執行緒出來(這樣是一值累加?)?
    直到會執行Exit Sub後,才可能回收所有的執行緒?

    不好意思,小弟對這觀念有點懵懵懂懂,希望大大們可以解釋一下。
    2010年2月9日 下午 10:41

解答

  • HI,

    除了記憶體會用光的問題以外, 如果有多個執行緒會同時執行同一個程序(例如HowAreYou), 還要注意此程序是否允許重覆進入的問題(Thread Safe)
    • 已標示為解答 js155036 2010年2月10日 上午 05:29
    2010年2月10日 上午 03:55
  • TechNet 可以抓的到 Process Explorer 和 Process Monitor,可以監看行程的運作以及記憶體消耗狀況。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 js155036 2010年2月10日 上午 05:29
    2010年2月10日 上午 05:20
    版主
  • 遞迴最白話的解釋就是一種自己會呼叫自己的函式, 用數學式的例子就是
    f(x)=f(x-1)*f(x-2)
    因為你要計算f(x)就要先知道f(x-1)與f(x-2),
    -->f(x-1)=f(x-2)*f(x-3) , f(x-2)=f(x-3)*f(x-4)
    如果沒有停止條件是不是就沒完沒了, 所以通常會出現一個 x範圍限制條件, 就像 x >=2
    所以當x<2時就不予計算, 這就叫停止條件.
    對這方面如果不熟, 建議你找一本資料結構與演算法的書自己研究一下, 這些算是寫程式的基本功.
    (雖然我知道可能有人會反駁說他沒學過這些程式也寫的好好的, 原因是他沒遇過夠複雜需要根柢紮的穩的程式)
    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    • 已標示為解答 js155036 2010年2月10日 上午 05:29
    2010年2月10日 上午 05:26
    版主

所有回覆

  • 我只想問一句:你試過了嗎?

    如果一直呼叫的話,按照你的程式碼會產生無數個 thread,可能到最後會出現 StackOverflowException 或是 OutOfMemoryException 這類的例外狀況。
    若對執行緒不熟,請多翻作業系統理論的書籍,一定會講到執行緒的觀念。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    2010年2月10日 上午 12:21
    版主
  •  這就是一種遞迴的寫法, 只是你的這個寫法沒有結束條件. 所以會造成無窮迴圈, 直到CLR發生Exception為止
    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    2010年2月10日 上午 02:43
    版主
  • HI,

    除了記憶體會用光的問題以外, 如果有多個執行緒會同時執行同一個程序(例如HowAreYou), 還要注意此程序是否允許重覆進入的問題(Thread Safe)
    • 已標示為解答 js155036 2010年2月10日 上午 05:29
    2010年2月10日 上午 03:55
  • 回小朱大大,

    恩,我在發問前有執行過,但是不知道它內部運作得如何了,

    也許是執行緒暫停1秒鐘,所以消耗的不夠快,

    是否有推薦的軟體可以觀察內部堆疊與記憶體消耗的狀況呢?

    好的,我會多翻這類的書,謝謝你的回覆。
    2010年2月10日 上午 05:05
  • 回Bill Chung,

    恩,瞭解了,那這樣我改用事件來通知,

    這樣我在事件裡面Call Hello,是否一樣算遞迴呢?

    感謝回答^^
    2010年2月10日 上午 05:07
  • 回tihs,

    請問是否有推薦的寫法,同樣可以避免造成遞迴卻沒有條件結束的問題呢?

    感謝回答^^
    2010年2月10日 上午 05:09
  • TechNet 可以抓的到 Process Explorer 和 Process Monitor,可以監看行程的運作以及記憶體消耗狀況。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    請不要藉新手之名行小白之實,否則只會讓更多無辜的新手得不到幫助而已。
    如果不知道什麼是小白,請參閱:何謂小白
    • 已標示為解答 js155036 2010年2月10日 上午 05:29
    2010年2月10日 上午 05:20
    版主
  • 遞迴最白話的解釋就是一種自己會呼叫自己的函式, 用數學式的例子就是
    f(x)=f(x-1)*f(x-2)
    因為你要計算f(x)就要先知道f(x-1)與f(x-2),
    -->f(x-1)=f(x-2)*f(x-3) , f(x-2)=f(x-3)*f(x-4)
    如果沒有停止條件是不是就沒完沒了, 所以通常會出現一個 x範圍限制條件, 就像 x >=2
    所以當x<2時就不予計算, 這就叫停止條件.
    對這方面如果不熟, 建議你找一本資料結構與演算法的書自己研究一下, 這些算是寫程式的基本功.
    (雖然我知道可能有人會反駁說他沒學過這些程式也寫的好好的, 原因是他沒遇過夠複雜需要根柢紮的穩的程式)
    MSDN 文件庫很重要
    問題本身越具體, 越容易得到大家的回應
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    • 已標示為解答 js155036 2010年2月10日 上午 05:29
    2010年2月10日 上午 05:26
    版主
  • 感謝小朱大大推薦的軟體分享。
    2010年2月10日 上午 05:27
  • Bill Chung <abbr class="affil">MVP,
    </abbr>
    好的,我想這些資訊應該足夠讓我有些方向繼續研讀下去,感恩。
    2010年2月10日 上午 05:29
  • 把 VBNET 附的範例 MultiThread 執行一遍,第三個按鈕狂按到爽,你的問題與解答,這個範例都示範得很清楚了。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年2月10日 下午 03:06