none
[VB .NET] 多綫程的優先權問題 RRS feed

  • 問題

  • 一個測試 Multi-Thread 的程式如下(VB .NET Console Application):

     

    Imports System
    Imports System.Threading

    Module Module1

        Private t1, t2 As Thread                        

        Sub Main()

            t1 = New Thread(AddressOf Threader1)    
            t2 = New Thread(AddressOf Threader2)   

            t1.Name = "Threader1"                   
            t2.Name = "Threader2"                  

            t1.Start()                              
            t2.Start()                             

            Console.ReadLine()                     

        End Sub

        Sub Threader1()
            Console.WriteLine("*** Threader1 Information ***")
            Console.WriteLine("Name = " & t1.Name)
            Console.WriteLine("t1.State = " & t1.ThreadState.ToString())
            Console.WriteLine("t1.Priority = " & t1.Priority)
            Console.WriteLine("*** End Threader1 Information ***")
        End Sub

        Sub Threader2()
            Console.WriteLine("*** Threader2 Information ***")
            Console.WriteLine("Name = " & t2.Name)
            Console.WriteLine("t2.State = " & t2.ThreadState.ToString())
            Console.WriteLine("t2.Priority = " & t2.Priority)
            Console.WriteLine("*** End Threader2 Information ***")
        End Sub

    End Module

     

    執行結果如下:

     

    *** Threader1 Information ***
    Name = Threader1
    *** Threader2 Information ***
    Name = Threader2
    t1.State = Running
    t2.State = Running
    t1.Priority = 2
    *** End Threader1 Information ***
    t2.Priority = 2
    *** End Threader2 Information ***

     

    然而,我希望的結應該是先完成t1,然後才執行 t2,如下:

     

    *** Threader1 Information ***
    Name = Threader1

    t1.State = Running
    t1.Priority = 2
    *** End Threader1 Information ***
    *** Threader2 Information ***
    Name = Threader2
    t2.State = Running
    t2.Priority = 2
    *** End Threader2 Information ***

     

    所以,在 t1.Start() 那行之前,先設定 t1 的優先權為最高:

     

    t1.Priority = ThreadPriority.Highest

    t1.Start()

     

    再次執行,但發覺結果依然沒變(只是所列出 t1 及 t2 的優先權有所不同):

     

    *** Threader1 Information ***
    Name = Threader1
    *** Threader2 Information ***
    Name = Threader2
    t1.State = Running
    t2.State = Running
    t1.Priority = 4
    *** End Threader1 Information ***
    t2.Priority = 2
    *** End Threader2 Information ***


     

    是否有方法解決這個問題呢?

     

    謝謝!

     

    2008年3月11日 下午 06:20

解答

  •  

    Hi Alva,

     

    you can try this,

     

     

    Code Snippet

    t1 = New Thread(AddressOf Threader1)    
            t2 = New Thread(AddressOf Threader2)   

            t1.Name = "Threader1"                   
            t2.Name = "Threader2"                  

            t1.Start()  

            t1.join()                            
            t2.Start()                             

            Console.ReadLine()   

     

     

    林泰宏 Terry Lin 
    技術支援工程師 Support Engineer
    Developer Support Team
    Global Technical Support Center - Taiwan

    技術支援服務首頁: http://support.microsoft.com

    技術支援專線: 0800-008-833(市話專用)/ 02-2999-8833

    2008年3月12日 上午 01:50

所有回覆

  •  

    Hi Alva,

     

    you can try this,

     

     

    Code Snippet

    t1 = New Thread(AddressOf Threader1)    
            t2 = New Thread(AddressOf Threader2)   

            t1.Name = "Threader1"                   
            t2.Name = "Threader2"                  

            t1.Start()  

            t1.join()                            
            t2.Start()                             

            Console.ReadLine()   

     

     

    林泰宏 Terry Lin 
    技術支援工程師 Support Engineer
    Developer Support Team
    Global Technical Support Center - Taiwan

    技術支援服務首頁: http://support.microsoft.com

    技術支援專線: 0800-008-833(市話專用)/ 02-2999-8833

    2008年3月12日 上午 01:50
  • Hi,

    多執行緒本身你比較難去控制他要在哪個時間點做切換,切換是由系統來處理的;多執行緒主要目的也是盡可能的在同一時間處理多件事,所以有一個滿大的議題是在說彼此之間如何同步資料或是資料鎖定等等;從你上面程式碼來看,如果說是要循序的這樣做下來,那不用兩個執行緒來作,一個就好了,Thread2也是要等Thread1先做完不是嗎。

    2008年3月12日 上午 01:59
    版主
  • 多緒是為了同時做,你有互相等待的話,要用 Thread 的狀態判斷,或是用 Join 合併。

     

    優先權是用來分配 CPU 資源權重用的,調整優先權並不會迫使某個執行緒優先跑完。

     

    2008年3月12日 下午 12:12
    版主