2009-09-30 65 views
0

好嗨,我正在Microsoft Visual Studio中制作一个程序,每当我运行它并单击开始(我有一个开始按钮)时,它将执行我已编程的操作,但窗体总是冻结,并没有显示我想要的东西(它说“不响应”,一旦我开始它)。这对工作很有好处,但我有一些应该表现出来的东西。虽然它一直处于冻结状态,但在运行过程中,它不会让我选择停止它,或显示我已设置更改的任何标签。任何帮助,将不胜感激。谢谢。程序没有响应

编辑:这是我有:

 void CheckAll() 
    { 
     for (; ;) 
     { 
      CheckPixel(); 
      Application.DoEvents(); 
     } 
    } 

这是不断做CheckPixel();,我认为就是为什么它被冻结的原因。从来没有休息过。

+3

为了得到最好的帮助,你需要把一些代码。否则,它在黑暗中的所有镜头。 – thepocketwade 2009-09-30 02:43:27

+0

你想用你的CheckAll()方法做什么?我猜你正试图读取位图中的每个像素或其他东西。 – MusiGenesis 2009-09-30 03:04:31

+1

我甚至不知道你可以做这样的无限循环。不得不尝试这个构造以查看它是否会起作用,而且它确实如此)。 – David 2009-09-30 03:06:41

回答

4

这通常意味着您阻止了UI线程(例如,在按钮单击处理程序中运行一个长操作)。不需要使用UI线程,通常需要将长I/O操作卸载到ThreadPool或您自己的工作线程。这并不总是容易做到的,并且需要仔细的设计和对并发性的良好理解等。

+0

+1 - 良好的链接 - 正确处理这类事情的好方法。 – David 2009-09-30 02:50:44

+0

也看看BackgroundWorker。 http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx – Ray 2009-09-30 03:04:15

+1

在处理多线程之前学习循环如何工作最好? – MusiGenesis 2009-09-30 03:26:00

4

您的应用程序因为处于无限循环而处于冻结状态。我不知道你如何解决这个问题,因为我不知道你在这里做什么。

更新:因为我需要上床睡觉,所以我打算在这里抛出一个猜测。你CheckPixel()方法也许应该有这样的签名:

public bool CheckPixel(int x, int y) 
{ 
    Color color = _myBitmap.GetPixel(x, y); 
    return (color == Color.Red); 
} 

其中_myBitmap是一种形式范围的位图。然后你的CheckAll()方法应该是这样的:

public bool CheckAll() 
{ 
    for (int x = 0; x < _myBitmap.Width; x++) 
    { 
     for (int y = 0; y < _myBitmap.Height; y++) 
     { 
      if (CheckPixel(x, y)) 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

G'night伙计!我会整整一周来到这里。

+1

嘿,这些猴子都是从哪里来的?他们为什么不坚持“单一退出点”的理念? – MusiGenesis 2009-09-30 03:27:56

+1

好吧,好吧,也许这是个人喜好,我应该改变它到一个更复杂的'休息'计划......好吧,那会让人困惑。好的。也许我应该放弃它。但是,嘿,猴子看... – 2009-09-30 03:29:43

+0

不,你的方式更好,但我们必须采取与他们的代码中的“for(;;)”的人采取婴儿的步骤。 :) – MusiGenesis 2009-09-30 03:30:46

1

而不是Application.DoEvents()为什么不用Threading.Thread.Sleep(0)替换?我不是专家,但我更喜欢Thread.Sleep,然后DoEvents更好。

+1

这是否允许用户界面回应?如果它正在睡觉,它如何回应?我必须尝试一下。谢谢! – David 2009-09-30 03:10:40

+0

它不允许UI响应AFAIK。休眠()在主UI线程上会阻塞,直到定时器启动,不允许线程处理任何与UI相关的事件。 – Gregory 2009-09-30 03:28:05

+0

嗯,我不确定,但我认为它让CPU执行其他任务可以释放其他进程“。我不认为它会阻止。 – jsoques 2009-10-01 02:22:14

0

你需要有一些退出循环的方式。

您的for循环需要逻辑从?至 ? (如在

for(int i = 0; , < 100; 1++) 

将将循环100次

OR

for(;;) 
{ 
    if(SomeCondition == true) 
    { 
     break; 
    } 
}