我有一个应用程序找到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
}
}
答案 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();
}
}