Brak kontaktu z aplikacją podczas wykonywania metody

0

Witam

Celem programu bylo zrobienie prostej symulacji, wyscigów. 4 Obiekty PictureBox (psy) przesuwają się po jednym obiekcie PictureBox (tor). - tu nie bylo problemów.

Jednym z wymagan do programu bylo zabezpieczenie przed wprwoadzaniem zmian w programie podczas trwania wyscigów, zrobiłem to poprzez wyłączenie klawiszy(elementów), mogących wprowadzać zmiany podczas trwania wyscigu i włączenie ich z powrotem po ukonczeniu wyscigu.

Mam jednak wrazenie że to zabezpieczenie jest niepotrzebne bo moja aplikacja nawet przy wyłączeniu tego mojego zabezpieczenie nie pozwala na żadną interakcję z użytkownikiem podczas trwania biegu. Nie można nawet wyłączyć okienka krzyżykiem - nie wiem dlaczego, prosiłbym o podpowiedzi i wyjasnienie dlaczego tak siędzieje (co robie nie tak?)

Metoda klasy Form1, czyli głownego okna:

 
        private void BiegPsow()
        { 
            bool koniecWyscigu = false;

            while (!koniecWyscigu)
            {
                for (int i = 0; i < charty.Length; i++)
                {
                    charty[i].Biegnij(randomizer.Next(1, 4));
                    //Thread.Sleep(5);      //dodanie Refresh() wystarczająco spowolnilo bieg
                    pictureBox1.Refresh();  //likwiduje "smuge" obrazkow psów na pictureBox1
                    if (charty[i].CzyWygralem())
                    {
                        zwycieskiPies = charty[i].nrPozycjiPsa;
                        koniecWyscigu = true;
                        break;
                    }
                }
            }
            
        }

metoda klasy Pies:

w klasie Pies swiadomie uzylem przestrzeni System.Windows.Form obiektu PictureBox - ogolnie wiem ze nie powinno sie tego robić ale tak bylo szybciej.

 
        public void Biegnij(int krok)
        {
            Point p = mojObrazek.Location;  
            pozycjaWBiegu = p.X + krok;
            p.X = pozycjaWBiegu;
            mojObrazek.Location = p;
        }

zdarzenie klawisza START

        private void buttonStart_Click(object sender, EventArgs e)
        {
            buttonStart.Enabled = false;
            buttonZatwierdź.Enabled = false;

            BiegPsow(); 
            PodsumowanieWyscigu();

            numericNrCharta.Value = numericNrCharta.Minimum;
            numericStawka.Value = numericStawka.Minimum;  
            buttonZatwierdź.Enabled = true;
            buttonStart.Enabled = true;
        } 
0

Prawdopodobnie dlatego, że robisz to wszystko w jednym wątku. Operacje na GUI + przesuwanie tych psów i przez to GUI się wiesza. Proponuje zrobić dwa wątki, w jednym wrzucić to co masz tutaj zrobione, czyli cały ten bieg psów, a drugi zostawić po prostu do obsługi GUI, żeby się nie wieszało.

0
Varran napisał(a)

4 Obiekty PictureBox (psy) przesuwają się po jednym obiekcie PictureBox (tor). - tu nie bylo problemów.

:(
Weź to zrób jak człowiek, rysuj psy i tor na jednej Bitmapie i wyświetlaj w jednym PictureBoxie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1