最近在写一个视觉软件demo(基于Halcon)
根据MEF框架下进行 后台代码的解耦。首推这一款框架,在自动化,运动控制,视觉领域可运用范围极广。
首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架)。单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架,MSDN中对MEF有这样一段说明:
Managed Extensibility Framework 或 MEF 是一个用于创建可扩展的轻型应用程序的库。 应用程序开发人员可利用该库发现并使用扩展,而无需进行配置。 扩展开发人员还可以利用该库轻松地封装代码,避免生成脆弱的硬依赖项。 通过 MEF,不仅可以在应用程序内重用扩展,还可以在应用程序之间重用扩展。
具体的还是百度,CSDN,GitHub上查询,废话不多说了。
问题起因:
根据MEF框架获取到的 窗体UI集合中的UI,去实例化具体功能窗体。
有一个窗体: LoadImage
第一步:应该根据参数加载 此功能的配方 图像
问题就出现在第一步。加载图像时,第一次完全打开后,可以打开,关闭后。第二次打开 图像无法显示。
首先怀疑了是不是Halcon显示图像有问题。
排查了 加载图像,显示图像,以及刷新UI。
发现一切都没有问题。
第二步:排查窗体句柄
经过排查,发现控件第一次打开时,UI窗体内部Halcon窗口句柄 在第一次打开时 句柄和完全关闭后 第二次打开的Halcon窗口句柄相同。
注意:窗口创建和窗口创建完毕即有句柄完全是两回事!!!
窗口创建时,窗口并没有创建句柄,只有Application.Run(form)或者form.Show()之后才有句柄,即窗口只有显示或者启动消息循环后才有句柄!如果创建form之后Form form = new Form(),主线程中调用form.Handle,如果句柄尚未创建,引用该属性将强制创建句柄,对系统内的逻辑将产生致命的影响。
窗口在被关闭后,句柄会被释放,你重复打开时,句柄并不会相同。
第一次打开LoadImage窗体:
第二次打开LoadImage窗体:
手动刷新窗体时的窗体句柄:
只有在手动刷新窗体时,Halcon窗体句柄发生了改变。
这令人费解,原理上,窗体销毁了,窗体内的控件也会同样释放,(并没有使用单例),重新实例化后,窗体的句柄不会是同一个。
以上这些前提条件,是导致这件事情的根本原因。
从最后结果上来看,当初由于对 Load,Shown 理解并不深刻,所以没有在这一步发觉问题的真相。
根据分析,是窗体加载时,加载的halcon窗口还是之前的,所以导致无法刷新。但是这个问题困扰许久,还是无法解决。
最后发现有可能是时序问题。群里几位小伙伴也讨论的激烈。
最终将在窗体Load事件中的LoadImage方法,转移到 窗体的Shown事件中。解决了这一问题。
以下抄录 知乎用户的对 窗体生命周期的分析,以此警钟长鸣 。
在C#中,窗体的生命周期指的是窗体对象从创建到销毁这一过程中的各个阶段和事件,通常包括以下8个阶段:
1.创建阶段(Creation):在使用关键字new创建窗体对象时,系统会为该对象分配内存空间,并调用其构造函数来初始化对象。
2.载入阶段(Load):在创建窗体对象后,Windows操作系统会在窗体中绘制出标题栏、菜单栏、工具栏等界面元素,并将窗体显示在屏幕上。此时会触发窗体的Load事件,可以在该事件中完成一些初始化操作。
3.显示阶段(Shown):在窗体完成载入后,会触发Shown事件,此时窗体已经完全显示在屏幕上,可以在该事件中执行一些与窗体显示相关的操作。
4.激活阶段(Activated):当用户单击窗体标题栏或在任务栏中选择窗体时,系统会将焦点切换到该窗体并将其激活,此时会触发Activated事件。
5.失去焦点阶段(Deactivate):当用户切换到其他窗体或最小化当前窗体时,当前窗体会失去焦点并进入Deactivate状态,此时会触发Deactivate事件。
6.关闭阶段(Closing):当用户单击窗体右上角的关闭按钮或在任务栏中选择关闭窗体时,会触发Closing事件,可以在该事件中处理窗体关闭前的一些操作。
7.关闭后阶段(Closed):当窗体关闭后,会触发Closed事件,可以在该事件中进行一些资源释放和清理操作。
8.销毁阶段(Disposed):当窗体对象被销毁时,会触发Disposed事件,此时窗体对象占用的内存空间会被系统回收。
了解窗体的生命周期可以帮助我们更好地管理窗体的状态和资源,并在不同的阶段处理不同的事件。
在此感谢群内的: 郭兄,杨兄。
标签:Load,MEF,创建,HalconControl,警钟长鸣,窗体,事件,句柄 From: https://www.cnblogs.com/PrograMMer-Ben/p/18083475