[英]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
類,那么您甚至可能想要創建該類的Thread
和string
值字段。 您甚至可能希望在此新對象類型的按鈕上創建一個字段,因此每個按鈕都將與一個按鈕相關聯。 這在面向對象設計中更為典型。 沒有理由應該維護四個單獨的大小相同的數組,每個數組的類型不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.