2 Stimmen

Das Textfeld aktualisiert den Text nicht, das Nachrichtenfeld hingegen schon

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.

enter image description here

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();

        }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X