我创建了一个包含线程的程序。有一个带面板的按钮,当一个线程访问面板时,该按钮应自动将其背景颜色变为粉红色。再次按下该按钮时,它应变为绿色。我的问题是当一个线程访问该面板时,该按钮不会变成粉红色,它保持默认颜色。但是当我点击它会改变颜色。
以下是我所做的: -
//这是按钮点击事件
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;
}
}
答案 0 :(得分:1)
当按下按钮时,您有按钮查看locked
变量,如果它被锁定(将是粉红色),那么当您更改时,您立即将其设置为未锁定(绿色)颜色,它只能变成绿色,你没有机会去粉红色。 Start2
方法设置locked
变量,但是你无法另外测试它来更改按钮(我假设您已经发现从另一个线程更改表单是不行的)。
你有两个选择,制作一个每100毫秒发射一次的计时器或者其他东西,用来测试锁定的&#39;变量并将按钮设置为粉红色。此计时器将位于表单线程上,因此可以更改按钮属性。
另外,你可以创建一个充当变量监听器的事件,并从你的线程内部调用事件。
答案 1 :(得分:0)
我设法找到了解决方案。我只是使用它的变量名来改变按钮的背景颜色。
这就是我所做的:
//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