我怎样才能阻止我的while循环?

我想用在C#下面的代码,但我似乎无法摆脱它。 我想终止应用程序,如果用户按下一个键或移动的啮齿动物(即鼠标)。 下面是我的代码(不是开玩笑!)。

private void frmDots_KeyDown(object sender, KeyEventArgs e) { bgNotClicked = false; Close(); } private void frmDots_Click(object sender, EventArgs e) { bgNotClicked = false; Close(); } while (bgNotClicked) { // Clear the first element in our XY position. This is the reverse of the way I normally create the dots application System.Drawing.Rectangle clearDots = new System.Drawing.Rectangle(Dots.PositionX[iCounter], Dots.PositionY[iCounter], 8, 8); // Create the black color and brush to clear dots Color clearDotsColor = Color.Black; SolidBrush clearDotsBrush = new SolidBrush(clearDotsColor); // Finally clear the dot e.Graphics.FillEllipse(clearDotsBrush, clearDots); GetRandomPosition(iCounter); // Fill the elements to display colors on the displays canvas System.Drawing.Rectangle colorDots = new System.Drawing.Rectangle(Dots.PositionX[iCounter], Dots.PositionY[iCounter], 8, 8); // Create the color and brush to show dots Color colorRandom = GetRandomColor(); SolidBrush colorBrush = new SolidBrush(colorRandom); // Finally show the dot e.Graphics.FillEllipse(colorBrush, colorDots); Thread.Sleep(5); iCounter++; if (iCounter == 399) { iCounter = 0; } } }

--------------解决方案-------------

编辑:

看到您的编辑之后,这肯定是你的问题。 问题是,你的while循环阻塞主UI线程,所以它永远不会处理Windows消息用来触发按键/鼠标/等处理。

你有两个选择 - 你可以将一些本到一个单独的线程,做什么,我建议以下,或添加调用Application.DoEvents在while循环。 这将使你的事件处理程序的运行,这又将一套bgNotClicked = false; 现在,这是从来没有发生,因为你的用户界面将被完全阻止。



原贴:

如果你正在做这个循环在你的UI线程,你将需要重新思考设计了一下。

设置bgNotClicked = false;在事件处理程序的地方都可以工作,但是只有当你的事件处理程序能够运行。 如果你正在做的UI线程上面的代码,它会阻止你的UI线程无限期,防止事件处理程序烧制而成。

我建议返工这是基于关闭计时器(因此它重复上定期运行),而不是锁定在while循环。 这将使你的其他UI事件来运行之间火了,而不是设置bgNotClicked = false;事件处理程序可以只设置为不启用定时器。

你的“忙等待”的策略是设计不良。 相反,你应该使用被解雇的事件处理程序:

  • 在按键。
  • 当鼠标被移动。

在这两种情况下,可以通过终止该应用程序作出响应。

bgNotClicked变量需要通过事件处理程序的按键被设置为false。

如果啮齿动物是由你的鼠标移动,你需要一个类似鼠标的事件处理程序。

break的关键字将终止循环。 在这种情况下,当你打,你想停止循环的情况下,你只用break;

如果你的循环一样,你需要给应用程序一个时刻来处理你希望将导致中断的事件。 这是的DoEvents方法的作业。

private bool WeAreDone = false;

private void DoingIt()
{
while (true)
{
Application.DoEvents();
if (WeAreDone)
{
break;
}
}
}

private void InterruptButton_Click(object sender, EventArgs e)
{
WeAreDone = true;
}

我想用一个定时器适合Windows的事件驱动模型比忙等待while循环更好。 您可以尝试这样的事情:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private int iCounter = 0;

private void Draw()
{
// ....
}

private void timer1_Tick(object sender, EventArgs e)
{
Draw();

iCounter++;
if(iCounter == 399)
{
iCounter = 0;
}
}

private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 5;
timer1.Enabled = true;
}

private void Form1_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
Close();
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
timer1.Enabled = false;
Close();
}
}

这并不似乎是正确的方法。 .Net框架已经为您提供了事件处理的KeyPress和mousemove /点击动作。 你为什么不使用它们?

尝试将循环转换成一个BackgroundWorker的DoWork的事件处理程序。 那么你的图形用户界面将仍然是敏感和替代那种讨厌的变量,你可以调用CancelAsync方法来停止循环。

您可以退出使用break语句循环。

编辑:好吧,我收回旗的事情!

Exit While

...................

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.460 (s). 10 q(s)