Переключить цвет кнопки

Я создал программу, которая содержит потоки. Есть кнопка с панелью, когда к панели обращается поток, кнопка должна автоматически изменить свой цвет фона на розовый. При повторном нажатии кнопки она должна стать зеленой. Моя проблема в том, что когда поток обращается к этой панели, кнопка не становится розовой, она остается в своем цвете по умолчанию. Но когда я нажимаю, он меняет цвет.

Вот что я сделал: -

// это событие нажатия кнопки

public void btn_Click(object sender, System.EventArgs e)
    {
        locked = !locked; //makes the locked variable true if it is false and vice versa

        this.btn.BackColor = locked ? Color.Pink : Color.Green;

        lock (this)
        {
            if (!locked)
            {
                Monitor.Pulse(this);

            }
        }
    }

Вот код, при выполнении которого кнопка должна автоматически стать розовой.

 public void start2()
        {
           Thread.Sleep(delay);


            while (true)
            {


            semaphore.Signal();
            this.ZeroPlane();
            panel.Invalidate();
            buff.read(ref colour, ref status);             

            for (int k = 0; k < 5; k++)
            {
                panel.Invalidate();
                this.movePlane(xDelta, yDelta);
                Thread.Sleep(delay);
                locked = true;
            }

            if (status == "1" || status =="2" || status == "3") //checks whether it has arrived at the destination
            {

                lock (this)
                {
                    while (locked)
                    {
                        Monitor.Wait(this); //keep the plane in the hub  until the button is pressed.
                    }
                }
                semaphore.Wait();

                buff.write(this.colour, this.status); //overwrites the buffer 

                buff.read(ref colour, ref status);



                for (int p = 0; p < 5; p++)
                {
                    this.westEast = true;
                    this.movePlane(0, 20);
                    Thread.Sleep(delay);
                    panel.Invalidate();


                }
                nextSemaphore.Wait();
                nextBuffer.write(this.colour, "0");
                this.colour = Color.Yellow;
                this.status = null;

            }


        }

person Troller    schedule 26.09.2013    source источник
comment
Возможно, мне что-то не хватает, но я не вижу, где поток влияет на цвет кнопки.   -  person nuke    schedule 26.09.2013
comment
@ Shehan.W Вам действительно нужна резьба?   -  person    schedule 26.09.2013
comment
Да, мне нужна резьба.   -  person Troller    schedule 26.09.2013


Ответы (2)


У вас есть кнопка, смотрящая на переменную locked, когда кнопка нажата, если она заблокирована (будет розовой), тогда вы сразу же установите ее не заблокированной (зеленый), когда это означает, что при изменении цвета она может перейти только к зеленый, вы не дали ему шанс стать розовым. Метод Start2 устанавливает переменную locked, но тогда у вас нет возможности дополнительно проверить это, чтобы изменить кнопку (я полагаю, вы обнаружили, что изменение формы из другого потока недопустимо).

У вас есть два варианта: создать таймер, который срабатывает каждые 100 миллисекунд или что-то в этом роде, который проверяет «заблокированную» переменную и устанавливает для кнопки розовый цвет. Этот таймер будет находиться в потоке форм, поэтому ему разрешено изменять свойства кнопки.

В противном случае вы можете создать событие, которое действует как прослушиватель переменной, и вызвать событие для запуска изнутри вашего потока.

person Colin Steel    schedule 26.09.2013

Мне удалось найти решение. Я просто изменил задний цвет кнопки, используя имя переменной.

Вот что я сделал:

         //more code here

         if (status == "1" || status =="2" || status == "3") //checks whether it has arrived at the destination

                   {

                    this.btn.BackColor = Color.Pink; //just change its colour to pink.
                    lock (this)
                    {
                    //rest of the code
person Troller    schedule 26.09.2013