簡體   English   中英

如何檢查線程狀態

[英]How do I check the state of a thread

我有winform應用程序,在其中嘗試播放多個視頻,並為此創建線程。 我的代碼是:

public String[,] vpath = new String[3, 7]; 
public Video[,] video = new Video[3, 7];
public static Thread[,] th = new Thread[3, 7];

public void playclick(object sender, EventArgs e)
    {
        int i, j;

        for (j = 0; j <= 7 - 1; j++)
        {
            for (i = 0; i <= 3 - 1; i++)
            {
                if (btnp[i, j].Capture)
                {
                    //play();

                    th[i, j] = new Thread(new ThreadStart(play));
                    th[i, j].IsBackground = true;
                    th[i, j].Start();
                }
            }
        }

    }

 public void play()
    {

            int i, j;
            for (j = 0; j <= 7 - 1; j++)
            {
                for (i = 0; i <= 3 - 1; i++)
                {
                    if (th[i, j].ThreadState == ThreadState.Running) // Having problem here
                    {
                        if (video[i, j].State != StateFlags.Running)
                        {
                            video[i, j].Play();
                        }
                    }
                }
            }      
    }

因此,如果沒有if語句,則只需按一次按鈕即可運行所有視頻。 但是我想運行該線程所在的特定視頻。

請幫助我

ThreadState是一個位掩碼類型的屬性(枚舉具有[Flags]屬性,始終是提示),因此您無需使用==直接檢查它,只需檢查相關位:

if ((t.ThreadState & ThreadState.Running) == ThreadState.Running) { ...

在這里閱讀有關ThreadState值的含義。 通過閱讀並可能閱讀整篇文章或整本書(強烈推薦!),您還很可能會發現您的方法可能不是理想的選擇。 雖然不知道您的確切結局,但很難提出確切的結局。

至於為什么要例外,HaemEternal在他的評論中對此做了詳細說明。 您一次只初始化一個線程,但是正在檢查所有線程。 null線程對象沒有ThreadState值。

不過,我是否可以建議您完全更改設計? 無需經常檢查激活了哪個線程。 您可以將Play()方法的簽名更改為接受Object ,然后可以使用該Object將正確的視頻傳遞給該方法。

public void playclick(object sender, EventArgs e)
{
    int i, j;

    for (j = 0; j <= 7 - 1; j++)
    {
        for (i = 0; i <= 3 - 1; i++)
        {
            if (btnp[i, j].Capture)
            {
                //play();

                th[i, j] = new Thread(new ParameterizedThreadStart(play));
                th[i, j].IsBackground = true;
                th[i, j].Start(video[i,j]);
            }
        }
    }

}

public void play(object video)
{
    Video vid = video as Video; 
    if (vid.State != StateFlags.Running)
    {
        vid.Play();
    }        
}

更好的方法是將這三個元素封裝在一個包含Video對象, Thread對象和path string對象中。

如果您擁有Video類,那么您甚至可能想要創建該類的Threadstring值字段。 您甚至可能希望在此新對象類型的按鈕上創建一個字段,因此每個按鈕都將與一個按鈕相關聯。 這在面向對象設計中更為典型。 沒有理由應該維護四個單獨的大小相同的數組,每個數組的類型不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM