2012-09-12 2 views
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 문이. 하지만 난 스레드가에있는 특정 비디오를 실행하려면 ..

은 pls는 저 사람

+1

처음으로 스레드를 초기화하는 루프를 통해 play()가 호출되고 모든 스레드를 반복하지만 첫 번째 스레드 만 초기화 한 경우가 아닙니까? play() 함수는 호출 된 스레드 만 처리하면 안됩니까? – HaemEternal

+0

어떤 Video 클래스입니까? Play는 정말 동기식 (모달)입니까? –

+0

스레드는 btnp (많은 동적 버튼 중 하나)를 누른 경우에만 생성됩니다 ... 그러면 play()가 호출됩니다. –

답변

4

ThreadState 도움이되는 비트 마스크 타입의 속성을 (ENUM은 [깃발] 속성을 가지고, 그것은 항상 힌트), 그래서 당신이 직접 ==를 사용하여 확인하지 않습니다, 당신은 단지 관련 비트를 확인해야합니다

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

읽기 here를 ThreadState 값의 의미에 대해. 아마도 전체 기사 나 전체 책을 읽어서 (매우 권장합니다!) 아마 당신이 아마도 이상적인 방법이 아님을 알게 될 것입니다. 정확한 최종 게임을 알기는 어렵지만 정확한 최종 게임을 알지 못합니다.

+0

ans @ Tar 주셔서 감사하지만 여전히 예외를 받고 ... if ((th [i, j] .ThreadState & ThreadState.Running) == ThreadState.Running) {..} 예외는 다음과 같습니다. ** NULL 참조 예외 처리되지 않았습니다 ** –

+0

글쎄 2dim 스레드 배열에 대해서만 말하고있었습니다. if (... Capture)없이 전체 행렬을 초기화하면 NullRef 예외가 발생하지 않습니다. 미안하지만, 가장 기본적인 것들이 있습니다. 문제가 있다면 스레드로 작업하지 않는 것이 좋습니다. – Tar

+0

if (btnp [i, j] .Capture))를 사용하지 않는다면, 내가 동적으로 생성 된 여러 btns가 있기 전에 bcoz가 눌려 졌는지 확인해야 할 것입니다. 개념 동적 버튼 ...하지만 기사와 덕분에 도와 주셔서 감사합니다 –

1

왜 예외를 얻는 지에 관해서는 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 객체 및 경로 string 포함 된 단일 객체의 3 개 가지 요소를 캡슐화하는 것입니다.

사용자가 Video 클래스를 소유하고 있다면 해당 클래스의 Threadstring 값 필드를 만들고 싶을 수도 있습니다. 이 새 오브젝트 유형의 버튼에 필드를 작성하여 각 버튼이 하나의 단추와 연관 될 수도 있습니다. 이것은 훨씬 더 일반적인 객체 지향 디자인입니다. 서로 다른 유형의 4 개의 별개 크기의 배열을 유지해야 할 이유가 없습니다.

+0

작동하지 않습니다. th [i, j]에서 예외가 발생합니다. 시작 (video [i, j]); 및 비디오 vid에서 오류 = 비디오를 비디오로; –

+0

예외는 무엇입니까? – Rotem

+0

잘못된 연산 예외 : 스레드가 매개 변수를 허용하지 않는 ThreadStart 대리자를 사용하여 만들어졌습니다. –

관련 문제