首页 > 其他分享 >记一次 HalconControl 无法正常显示埋下的坑 关于Shown,Load,警钟长鸣

记一次 HalconControl 无法正常显示埋下的坑 关于Shown,Load,警钟长鸣

时间:2024-03-19 17:22:52浏览次数:12  
标签:Load MEF 创建 HalconControl 警钟长鸣 窗体 事件 句柄

最近在写一个视觉软件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

相关文章

  • a标签下载文件设置download无效
    场景:通过接口获取文件信息,再动态生成a标签,添加href、download,点击文件下载后,文件名并不是设置的download问题:接口返回数据的文件url域名跟当前系统域名不一致,导致download失效解决方案:采用原生请求设置responseType来实现指定download下载<div@click="download">点击下载</div......
  • 【nload】nload的安装和使用
    目录一、nload介绍二、nload下载和安装安装依赖环境远程下载nload安装包解压文件编译安装三、命令用法参数实例:运行nload之后,可以使用的快捷键:一次显示多个设备,不显示流量图设置计算时间窗口的长度(以秒为单位)设置显示的刷新间隔(以毫秒为单位,默认值为500)一、n......
  • Linux系统——nload命令
    目录引言一、nload安装二、nload命令详解1.命令使用2.命令详解3.命令选项3.1-u选项nload-uh自动变更单位,Bit/s nload-uH自动变更单位,Byte/s3.2-m选项nload-m不显示流量图 nload-m-Hens33 不显示流量图,以Byte为单位查看ens33网卡流量情况3.3-a选项n......
  • Linux Java调用 海康sdk报 Unable to load library '/home/slife/bsmt/HCNetSDK_linux
    1、问题在Linux下java调研libPlayCtrl.so文件失败 解决方案:sudovim~/.bashrc 在该文件末尾追加:exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/slife/bsmt/HCNetSDK_linux64/刷新一下source~/.bashrcok参考链接 https://www.cnblogs.com/kikyoqiang/p/14911373.......
  • van-uploader 压缩图片
    在使用van-uploader组件上传图片时,如果需要在客户端进行图片压缩,可以使用JavaScript的CanvasAPI来实现。以下是一个简单的示例,展示了如何在上传之前对图片进行压缩:html<template><van-uploaderv-model="fileList":after-read="compressImage"accept="im......
  • three模型加载loader模块封装
    在three项目中需要加载很多的模型而且在很多地方需要使用loader加载模型回调的gltf上一个项目中遇到了初学three的我留下笔记简单版`import*asTHREEfrom'three';import{GLTFLoader}from'three/examples/jsm/loaders/GLTFLoader.js';constloader=newGLTFLoa......
  • 滴水逆向笔记系列-win32总结3-48.提取图标_修改标题-49.通用控件_实现LoadPE
    第四十八课win32提取图标_修改标题1.添加图标a,.右键添加icon时不要直接新建,导入b.加载图标:::infoHICONhIcon;hIcon=LoadIcon(hAppInstance,MAKEINTRESOURCE(IDI_ICON));hAppInstance 应用程序句柄IDI_ICON 图标编号MAKEINTRESOURCE 用这个宏的主要原因......
  • Prometheus reload配置
    近期在对Prometheus进行线上环境配置时,领导说最好不要重启,因为会中断数据。如果不能restart只能找办法进行reload,经过查询发现有以下两种方式可以进行reload配置。方式一:ExecReload=/bin/kill-HUP$MAINPIDroot@grafana:~#cat/etc/systemd/system/prometheus.service;[......
  • PyInstaller does not include a pre-compiled bootloader for your platform.
    用PyInstaller打包python程序时,收到下面错误:User140343INFO:BuildingPKGbecausePKG-00.tocisnonexistent140344INFO:BuildingPKG(CArchive)mainwindow.pkg215759INFO:BuildingPKG(CArchive)mainwindow.pkgcompletedsuccessfully.215891INFO:Bootloa......
  • PyInstaller does not include a pre-compiled bootloader for your platform.
    用PyInstaller打包python程序时,收到下面错误:User140343INFO:BuildingPKGbecausePKG-00.tocisnonexistent140344INFO:BuildingPKG(CArchive)mainwindow.pkg215759INFO:BuildingPKG(CArchive)mainwindow.pkgcompletedsuccessfully.215891INFO:Bootloa......