GDI +在加载数据时绘制,如地图

时间:2011-03-29 19:50:15

标签: c# .net drawing gdi+

我有一个应用程序找到2个方格之间的最短路径,当路径更长或更复杂时,它可能需要1-2秒才能找到它,我想在屏幕上写一个更改的加载消息(首先“加载”然后“加载”,然后“加载......”等。

另一个问题是,如果需要更长时间(10-12秒),应用程序会发出“无响应”消息,如何摆脱这种情况?

到目前为止的代码:

Form1.cs中:

namespace PathFinder
{
   Map map1;
   public Form1()
   {
      map1 = new Map(tileDimension, mapDimension);
      map1.Generate(); //the function that calculate the path
      this.Invalidate();
   }

   private void Form1_Paint(object sender, PaintEventArgs e)
   {
      //drawings
      this.Invalidate();
   }
}

Map.cs:

命名空间PathFinder    {

  public Map(Point tileDim, Point mapDim)
  {
     //Initialization
  }

  public Generate()
  {
     //lots of loops
  }

}

3 个答案:

答案 0 :(得分:2)

原因是UI主线程必须处理事件。 如果不是一段时间,它会开始抱怨,这就是你所经历的。

因此,您不应该通过任何冗长的处理来阻止UI线程。

使用BackgroundWorker Class进行此类操作。

另一个选项(不推荐)将使用

for...
{
    // ...
    // Some lengthy part of processing, but not as lengthy as the whole thing
    Application.DoEvents();
}
如果您选择在UI线程中进行处理,则在漫长的操作周期之间

答案 1 :(得分:1)

使用BackgroundWorker卸载工作线程上长时间运行的计算。这可以防止UI冻结。 BGW完全由MSDN Library覆盖,请务必按照示例进行操作。

然而,您仍需要使用Paint事件在UI线程上完成任何绘图。请确保尽快完成。让工作人员将路径存储在Point []或GraphicsPath中。在BGW的RunWorkerCompleted事件处理程序中调用Invalidate()以使paint事件运行。

答案 2 :(得分:0)

查看您的代码可能有所帮助。为了避免窗口停止,您可以使用单独的thread进行计算,或者在您的过程中,如果winform,您可以使用Applications.DoEvents();。 正如我所说。

这有用吗?

namespace PathFinder
{
   Map map1;
 BackgroundWorker GetSomeData = new BackgroundWorker();

   public Form1()
   {
      GetSomeData .DoWork += new DoWorkEventHandler(GetSomeData_DoWork);
      map1 = new Map(tileDimension, mapDimension);
      GetSomeData.RunWorkerAsync();
      this.Invalidate();
   }
 void GetSomeData_DoWork(object sender, DoWorkEventArgs e)
 {
      map1.Generate(); //the function that calculate the path
 }

   private void Form1_Paint(object sender, PaintEventArgs e)
   {
      //drawings
      this.Invalidate();
   }
}