这是我尝试运行的应用程序的图片:
当我尝试在外部单击,移动或最小化它时,窗口将挂起:
我的代码:
public void Process()
{
// using (HalconDotNet.HWindowControl HWinCtrl = new HalconDotNet.HWindowControl())
// {
using (PitFinderEngine VisionEngine = new PitFinderEngine())
{
foreach (string jpegfile in JpegFiles)
{
try
{
string[] parts1 = jpegfile.Split('\\');
string[] parts2 = parts1[parts1.Length - 1].Split('.')[0].Split('_');
string row = parts2[parts2.Length - 2].Split('R')[1];
string col = parts2[parts2.Length - 1].Split('C')[1];
Results.Add(row + " " + col, VisionEngine.action(jpegfile, "Production"));
//FormControls.ProgressBar_DoStep();
}
catch (Exception e)
{
}
}
}
}
以这种方式调用“过程”:
public static Thread StartTheThread(string LN, string TN)
{
var t = new Thread(() => RealStart(LN, TN));
t.Start();
return t;
}
private static void RealStart(string ln, string tn) {
Lots[ln].Tiles[tn].Process();
}
public static void DoWork()
{
string[] Directories = Directory.GetDirectories(LotPictureFolder);
List<Thread> ThreadList = new List<Thread>();
foreach (string lot in Directories)
{
string[] parts = lot.Split('\\');
string LotName = parts[parts.Length - 1];
foreach (string tile in Lots[LotName].Tiles.Keys)
{
if (!Lots[LotName].Tiles[tile].VicFileFound)
{
ThreadList.Add(StartTheThread(LotName, tile));
}
}
}
bool AllDone = false;
while (!AllDone)
{
AllDone = true;
foreach (Thread th in ThreadList)
{
if (th.IsAlive)
{
AllDone = false;
}
}
}
}
看起来
VisionEngine.action(jpegfile, "Production")
如果我要移动窗户,则需要10毫秒-20毫秒才能运行,并负责吊起窗户;意思是,如果我将其注释掉,问题将不复存在,是否有可能隔离此代码,我尝试使用线程,但问题仍然存在,因为平台是.Net3.5,所以我无法使用任务。
问题在于,当您为应用程序运行更长的任务时,它会阻塞UI
直到完成命令。这是因为您的任务阻止了MainThread
该订单,因此UI
无法响应,因为它也正在运行MainThread
。因为UI
Windows不响应,所以它告诉您:嘿,监视此窗口当前不响应任何用户操作。
即使您的应用程序在后台做了很多事情(您分配应用程序要做的事情),但这对用户和Windows都没有关系。问题在于,一旦您在应用程序上单击更多,被阻止的UI
Windows仍会注意到该情况并建议您关闭窗口,因为该应用程序似乎卡住了。
只需在长时间运行的任务中使用Application.DoEvents()。其行为如下:
调用此方法会使当前线程在处理所有等待窗口消息时挂起。
因此,它暂停了您当前正在长时间运行的任务,以处理来自例如用户输入的Windows消息,从而最大化,移动,...窗口。之后,它将继续处理您的长期订单。
Application.DoEvents();
这意味着,例如,如果您的方法需要10秒钟才能完成,则调用Application.DoEvents()
一次会使您的应用程序仅处理用户操作一次,这似乎不是您想要的行为。因此,您必须多次调用它。请注意,这会使您的运行方法明显变慢。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句