2012-04-20 14 views
2

私はこのアプリケーションで2つのスレッドを使用しています。これはTronゲームです。私は各ゲームの終わりにスコアを表示するTextBoxを持っています。各 "ゲーム"は2番目のdrawThreadスレッドに描画されます。テキストボックスはテキストは更新されませんが、メッセージボックスは

私はTextBox.Textを変更した後、MessageBoxにスコアを表示し、MessageBoxはスコアを表示しますが、TextBoxは表示されません。

enter image description here

任意のアイデア?私はスレッドセーフ呼び出しを使用することを確認しています(しかし、私はそれが作成されたスレッドのテキストを変更しています)。問題のコードはcreateGame()メソッドにあり、

SetLabel(score);

public Form1() 
     { 
      InitializeComponent(); 
      canvas = game_panel.CreateGraphics(); 
      formCanvas = this.CreateGraphics(); 
      game_panel.Invalidate(true); 
      bikes = new List<LightBike>(); 
      bikes.Add(new LightBike(new Point(game_panel.Size.Width - 25, game_panel.Height/2), Color.Blue, "left", new DirectionKeys(Keys.Left, Keys.Down, Keys.Up, Keys.Right, Keys.Control))); 
      bikes.Add(new LightBike(new Point(25, game_panel.Height/2), Color.Red, "right", new DirectionKeys(Keys.A, Keys.S, Keys.W, Keys.D, Keys.Q))); 
      createGame(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      if (drawThread.ThreadState == ThreadState.Stopped) 
      { 
       InitializeComponent(); 
       createGame(); 
       drawThread.Start(); 
      } 
      else 
      { 
       if(drawThread.ThreadState != ThreadState.WaitSleepJoin) 
        drawThread.Start(); 
      } 
      button1.Text = "Play Again"; 

     } 
public void SetLabel(string message) 
     { 

      if (this.textBox1.InvokeRequired) 
       this.textBox1.Invoke((Action<string>)SetLabel, message); 
      else 
       this.textBox1.Text = message; 
      MessageBox.Show(message); 
     } 
public void createGame() 
     { 
      if (!firststart) 
      { 
       foreach (LightBike b in deleteBikes) 
       { 
        if(b.color == Color.Blue) 
         bikes.Insert(0,b); 
        if (b.color == Color.Red) 
         bikes.Insert(1, b); 
       } 
       bikes[0].Redraw(new Point(game_panel.Size.Width - 25, game_panel.Height/2), "left"); 
       bikes[1].Redraw(new Point(25, game_panel.Height/2), "right"); 
      } 
      drawThread = new Thread(drawBikes); 
      grid = new int[game_panel.Size.Width, game_panel.Size.Height]; //create the grid map 

      game_panel.Update(); 

      String score = ""; 
      foreach (LightBike b in bikes) 
      { 
       score += b.toColorString() + ": " + b.score + " "; 
      } 
      SetLabel(score); 
      textBox1.Refresh();   
     } 

public void drawBikes() 
     { 
      String gameStatus = "WIN"; 

      deleteBikes = new List<LightBike>(); 
      while (true) 
      { 
       int tieCount = 0; 

       foreach (LightBike b in bikes) //check collision 
       { 

        if (!isValidLocation(b.location)) 
        { 
         deleteBikes.Add(b); 
         tieCount++; 
        } 
       } 
        foreach (LightBike b in deleteBikes) 
        { 
         //MessageBox.Show("DELETED BIKES: " + b.color.ToString()); 
         bikes.Remove(b); 
        } 
        if (tieCount > bikes.Count) //if the deleteBikes contain more than the bikes 
        { 
         gameStatus = "TIE"; 
         break; 
        } 

       if (bikes.Count <= 1) //game over 
        break; 

       foreach (LightBike b in bikes) //draw bikes 
       { 

        //canvas.DrawLine(new Pen(b.color, BIKE_SIZE), b.getPreviousLocation(), b.location); 
        canvas.DrawLine(new Pen(b.color, BIKE_SIZE) { EndCap = System.Drawing.Drawing2D.LineCap.Square }, b.location, b.getNextLocation()); 
        //MessageBox.Show("Bike "+b.color.ToString()+": "+Form1.ActiveForm.GetPixelColor(b.location.X, b.location.Y).ToString()); 
        grid[b.location.X, b.location.Y] = (bikes.IndexOf(b) + 1); 
       } 

       foreach (LightBike b in bikes) //update positions 
       { 
        if(b.isBoosting && b.boostCounter > 0) //player is boosting 
        { 
         while(isValidLocation(b.getNextLocation())) 
         { 
          b.location = b.getNextLocation(); 
          b.boostCounter--; 
          if (b.boostCounter == 0) 
          { 
           b.isBoosting = false; 
           b.boostCounter = 20; 
          } 
         } 
        } 
        b.location = b.getNextLocation(); 

       } 

       Thread.Sleep(GAME_SPEED); 

      } 
      String endingString =""; 
      foreach (LightBike b in bikes) 
      { 
       endingString += b.toColorString() + " "; 
       if (gameStatus == "WIN") 
        b.score += 1;  
      } 


      endingString += gameStatus+"!"; 
      canvas.DrawString(endingString,new Font("Times New Roman",20),new SolidBrush(Color.White),new Point(150,200)); 


      firststart = false; 
      drawThread.Abort(); 

     } 
+0

を検出する必要はありません。テキストを変更した後の.DoEvents()。 – SimpleVar

+0

利用できません。これをtextBox1.Refresh()の後に置きます。何も変わらない –

+0

DoEventsの前にメッセージボックスが表示されるため...メッセージボックスの直前にSetLabelメソッドを挿入します。 – SimpleVar

答えて

0

の代わりにこの:この行う

public void SetLabel(string message) 
{ 

    if (this.textBox1.InvokeRequired) 
     this.textBox1.Invoke((Action<string>)SetLabel, message); 
    else 
     this.textBox1.Text = message; 
    MessageBox.Show(message); 
} 

ジャスト:

public void SetLabel(string message) 
{ 
    // processing things here 


    this.Invoke((MethodInvoker)delegate 
    { 
     // UI things here 

     this.textBox1.Text = message; 
    }); 


    MessageBox.Show(message); 
}  

そのように、あなたが絶え間なくアプリケーションを呼び出してみInvokeRequired

関連する問題