Ich verwende zwei Threads in dieser Anwendung, die ein Tron-Spiel ist. Ich habe eine TextBox, die den Spielstand am Ende eines jeden Spiels anzeigt. Jedes "Spiel" wird im 2. drawThread Thread gezeichnet.
Die Sache ist, ich zeige die Partitur in einer MessageBox die Zeile, nachdem ich die TextBox.Text ändern und die MessageBox zeigt die Partitur gut, aber die TextBox nicht.
Haben Sie eine Idee? Ich stelle sicher, Thread Safe Invokes zu verwenden (allerdings ändere ich den Text in dem Thread, in dem er erstellt wird). Der betreffende Code befindet sich in der createGame()-Methode und lautet
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();
}