2013-03-22 5 views
0

이전에 간단한 공 및 패들 프로그램을 모두 하나의 형식으로 실행했습니다. 이제는 별도의 스레드에서 볼을 실행하려고 시도하지만, 나머지 프로그램은 동일하게 유지하면서 개념적으로 어떻게 볼을 별도의 스레드로 실행시키는 지 이해하지 못합니다.타이머를 사용하여 스레드에 객체 동기화하기

원래 타이머가 볼을 움직이게 만들었 기 때문에 그 볼 줄을 내 ballUpdate 클래스에 삽입 할 수 있다고 생각했습니다. 하지만 지금 내 질문에 스레드가 내 현재 타이머가 작동하도록하는 방법이 있다면입니다.

이 내가이 뭔가 가야 거라고 생각

public partial class Form1 : Form 
    { 
     Graphics paper; 
     Paddle paddle = new Paddle(); 
     Ball ball = new Ball(); 
     Thread myThread; 
     BallUpdate ballUpdate = new BallUpdate(); 

     public Form1() 
     { 
      InitializeComponent(); 
      myThread = new Thread(() => ballUpdate.ballMotion(ball)); 
      myThread.Start(); 
     } 

     private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
      paper = e.Graphics; 
      paddle.drawPaddle(paper); 
      ball.drawBall(paper); 

     } 
     private void timer1_Tick(object sender, EventArgs e) 
     { 
      //ball.moveBall(); 
      ball.collide(); 
      ball.hitPaddle(paddle.PaddleRec); 
      this.Invalidate(); 
     } 

처럼 내 Form1에 보이는 것입니다했으나 볼이 전혀 이동하지 않습니다.

class BallUpdate 
{ 
    public BallUpdate(){} 

    public void ballMotion(Ball x) 
    { 
     while(true) 
     { 
      x.moveBall(); 
      Thread.Sleep(30); 
     } 
    } 
} 
+1

스레드를 계속 실행하려면 루프가 필요합니다. – Romoku

+1

... Thread.Sleep은 밀리 초 (1/10 == 0)의 정수 시간 간격을 허용합니다. –

+0

@Romoku 좋아요. x.moveball에 대한 루프도 추가 했으므로 Thread.Sleep가 1로 변경되었습니다. 움직여 라. – krikara

답변

1

ballUpdate을 초기화하고 myThread을 시작해야합니다. 공의 로직 만 별도의 스레드에 있어야합니다. BallUpdate 변화 if(true)while(true)

public partial class Form1 : Form 
    { 
     Graphics paper; 
     Paddle paddle = new Paddle(); 
     Ball ball = new Ball(); 
     Thread myThread; 
     BallUpdate ballUpdate = new BallUpdate(); 

     public Form1() 
     { 
      InitializeComponent(); 
      myThread = new Thread(() => ballUpdate.ballMotion(ball)); 
      myThread.Start(); 
     } 

     private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
      paper = e.Graphics; 
      paddle.drawPaddle(paper); 
      ball.drawBall(paper); 

     } 
     private void timer1_Tick(object sender, EventArgs e) 
     { 
      //ball.moveBall(); 
      ball.collide(); 
      ball.hitPaddle(paddle.PaddleRec); 
      this.Invalidate(); 
     } 

는 종료로부터 실을 방지 할 수있다. 당신의 공이 날지 않도록 딜레이를 통합하십시오.

class BallUpdate 
{ 
    public BallUpdate(){} 

    public void ballMotion(Ball x) 
    { 
     while(true) 
     { 
      x.moveBall(); 
      Thread.Sleep(10000); 
     } 
    } 
} 
0

내가 다음을 통해 루프 스레드 방법을 구축 권하고 싶습니다 : 마지막으로 계산부터의 시간, 밀리 초

  1. 계산 시간 범위를
  2. 이동 모든 객체 따라
  3. 충돌 확인하고 해결
  4. 표시 방법을 호출하여 프레임을 렌더링하십시오.
  5. 단계로 돌아 가기 1

각 프레임마다 새 스레드를 만들지 마십시오. 성능이 저조합니다. 또한 스레드의 그래픽 객체를 조작하지 마십시오.

관련 문제