2

複数のビデオを再生しようとしている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 ステートメントがなければ、ボタンを 1 回押すだけですべてのビデオが実行されます。しかし、スレッドが含まれている特定のビデオを実行したい..

みんな助けてください

4

3 に答える 3

5

ThreadState はビットマスク型のプロパティです (enum には [Flags] プロパティがあり、これが常にヒントになります)、== を使用して直接確認する必要はありません。関連するビットのみを確認する必要があります。

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

ThreadState 値の意味については、こちらを参照してください。それと、おそらく記事全体、または本全体 (強くお勧めします!) を読むと、おそらくあなたのアプローチが理想的なアプローチではないことに気付くでしょう。ただし、正確なエンドゲームがわからないため、正確なエンドゲームを提案するのは困難です.

于 2012-09-12T08:01:21.923 に答える
1

なぜ例外が発生するのかについて、HaemEternal はコメントでそれを明確にしました。一度に 1 つのスレッドのみを初期化していますが、すべてのスレッドをチェックしています。スレッド オブジェクトに値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オブジェクト、およびパスを含む単一のオブジェクトにこれら 3 つの要素をカプセル化することstringです。

Videoクラスを所有している場合は、そのクラスのThreadおよびstring値フィールドを作成することもできます。この新しいオブジェクトのタイプのボタンにフィールドを作成して、各ボタンがボタンに関連付けられるようにすることもできます。これは、オブジェクト指向設計の典型です。それぞれが異なる型の、同じサイズの 4 つの別個の配列を保持する必要がある理由はありません。

于 2012-09-12T08:31:50.963 に答える