【VM服务管家】VM4.0软件使用_1.3全局模块类

news2024/12/22 23:32:22

目录

  • 1.3.1 通讯管理:通讯管理的心跳管理功能的使用方法
  • 1.3.2 全局触发:使用全局触发功能执行流程的方法
  • 1.3.3 全局变量:全局变量关联流程中具体模块结果的方法
  • 1.3.4 全局脚本:方案加载完成信号发给通信设备的方法
  • 1.3.5 全局脚本:通信设备ID获取方法
  • 1.3.6 全局脚本:PLC通讯字符触发流程执行的方法
  • 1.3.7 全局脚本:通过全局脚本加载本地图像的方法
  • 1.3.8 全局脚本:通过全局脚本获取通讯输入的参数并赋值给全局变量
  • 1.3.9 全局脚本:VM加载方案后自动执行的方法
  • 1.3.10 全局脚本:多流程协作控制的方法
  • 1.3.11 全局脚本:通过通讯触发快速匹配模块换型的方法

1.3.1 通讯管理:通讯管理的心跳管理功能的使用方法

描述
环境:VM4.0.0
问题:当外部设备与视觉保持连接过程中,由于各种不可控的原因(例如网线被意外拔出,网口松动,视觉程序意外退出),如何让外部设备的程序可以知道:与视觉的通讯已经中断。
可以通过通讯管理模块中的心跳功能实现能够给出上述问题的解决方案。
第一步:打开通讯管理,点工具栏通讯管理图标即可进入。如下图黄色箭头所示的图标。
在这里插入图片描述

第二步:找到心跳管理模块,设置心跳,如下图所示:
在这里插入图片描述

心跳类型选择多数据,时间间隔设置1000ms,这样与视觉连接的客户端就会每隔1s收到不同的字符串,比如当前收到“HeartBeat0”,经过1s后将收到“HeartBeat1”,再经过1s又收到”HeartBeat0”,如此循环。这样,当客户端不再收到来自视觉的发送的字符,或者视觉发送的字符不再变化,都说明通讯发生了异常。
问题根因

  1. 不了解通讯管理模块中的心跳功能怎么使用
  2. 心跳类型单数据和多数据的区别

1.3.2 全局触发:使用全局触发功能执行流程的方法

描述
环境:VM4.0.0
现象:我们这里以TCP通讯为例,视觉作为TCP服务端,与视觉交互的第三方设备作为TCP客户端。当TCP客户端连接上视觉服务端后,客户端发送字符串T1,视觉执行流程1;
客户端发送字符串T2,视觉执行流程2。
解答
这样的需求我们可以通过全局触发功能实现。这里介绍两种方法,方法一为更通用的方法,其接收的数据类型可以是int,float,string,byte等类型;方法二为简单方法,但接收的数据类型只能是string类型。
方法一:
第一步: 打开VM后,在快捷菜单中点击通信按钮
在这里插入图片描述

在打开通信界面后,点击设备列表后的加号,在协议类型中选择TCP服务端,设置需要的本机IP和本机端口,点击创建。
在这里插入图片描述

第二步:点击接收事件,进入接收事件窗口,点击事件列表后的加号,选择字节匹配处理方式,选择协议组装事件类型,点击创建。
在这里插入图片描述

将绑定设备选为需要进行通信的设备的名称,这里选择TCP服务端,点击规则列表下的加号,根据需要添加相应的规则。比如这里接收字符串T1,就将类型设为string,比较规则设置为等号。
在这里插入图片描述

需要注意的是,在规则列表中目前只支持与逻辑,也就是说必须全部满足该事件下的规则才能触发该事件。这里由于要求通讯接收到T1时执行流程1,接收到T2时执行流程2,属于或的逻辑,因此需要使用两个接收事件。第一个事件接收T1,第二个事件接收T2。
在这里插入图片描述

第三步:在快捷菜单中点击全局触发按钮。
在这里插入图片描述

点击事件触发序号下的加号,根据项目情况添加触发事件。
在这里插入图片描述

第四步:为了看到效果,分别建立两个一样的流程。
在这里插入图片描述

当执行该流程后给客户端发送流程已执行,打开网络调试助手,实际效果如下。
在这里插入图片描述

需要注意的是:这种使用接收事件进行触发的方法属于通用型方法,接收的数据类型可以是int,float,string,byte类型。
在这里插入图片描述

但是,如果接收的数据类型为string类型,还有一种更简单的方法。
方法二:
第一步:与方法一的第一步相同,创建TCP服务端
第二步:借助全局触发中的字符串触发。假如现在希望客户端给服务端发送T3,执行流程3,可以按下图所示进行配置。
在这里插入图片描述

第三步:添加流程3,客户端发送T3,执行效果如下
在这里插入图片描述

问题根因
不熟悉全局全局触发工具的使用。

1.3.3 全局变量:全局变量关联流程中具体模块结果的方法

描述
环境:VM4.0.0
问题:将视觉流程中模板匹配算法模块运行的结果数据:特征匹配点X关联全局变量MatchResultX。
解答
在流程运行的主界面中,按照下面1,2,3,4步骤操作,第一步选中算法模块,第二步选择模块结果Tab页,第三步点击订阅数据图标,第4步选择全局变量。
在这里插入图片描述

问题根因
不了解全局变量的绑定操作

1.3.4 全局脚本:方案加载完成信号发给通信设备的方法

描述
环境:VM4.0.0
现象:需要在方案加载完成后,发送加载完成信号到全局变量,发送给通信设备。
解答
全局脚本的使用可以通过打开示例,完成常用的基本功能开发。
在这里插入图片描述

打开全局通信代码后,在脚本中添加代码
在这里插入图片描述

问题根因
全局脚本和通信接口不熟悉。

1.3.5 全局脚本:通信设备ID获取方法

描述
环境:VM4.0.0
现象:4.0版本之前,全局脚本中通信数据接收函数中的DeviceID是按照设备管理列表中至上而下、从0开始依此增1,现在这种方法行不通。
在这里插入图片描述

解答
VM4.0版本每次增加设备列表都会分配唯一的ID号,后续全局脚本中判断设备ID通过这个唯一ID识别,不再从上到下默认排序。
问题根因
版本更新。

1.3.6 全局脚本:PLC通讯字符触发流程执行的方法

描述
环境:VM4.0.0
现象:PLC通讯字符改变时,触发流程执行一次的方法
解答
打开全局通信脚本,在UserGlobalMethods_OnReceiveCommunicateDataEvent里面修改,修改代码如下:

1.	C#
2.	 
3.	string strTemp="0000";
4.	public override void UserGlobalMethods_OnReceiveCommunicateDataEvent(ReceiveDataInfo dataInfo)
5.	{
6.	    if(dataInfo == null || dataInfo.DeviceData==null)
7.	    {return;}
8.	//接收到的数据转成字符串
9.	string str = System.Text.Encoding.Default.GetString(dataInfo.DeviceData);
10.	 
11.	    if(dataInfo.DeviceID==1)
12.	    {
13.	        //解析收到的数据
14.	        if(str=="0100"&&strTemp=="0000")
15.	        {
16.	            ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle,10000,null);
17.	        }
18.	 
19.	        if(str=="0400"&&strTemp=="0000")
20.	        {
21.	            //执行流程2 一次
22.	        	  ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle,10001,null);      		}
23.	            strTemp=str;
24.	        }
25.	    }
26.	}

问题根因
不熟悉全局脚本、寄存器机制。

1.3.7 全局脚本:通过全局脚本加载本地图像的方法

描述
环境:VM4.0.0
现象:VM通过全局脚本加载本地图像
解答
通过VM的全局脚本加载本地图像的步骤如下所示:
1、打开全局脚本,选择需要的示例
在这里插入图片描述

2、在运行函数中插入如下代码

1.	public int Process()
2.	{
3.	    //m_operateHandle 二次开发SDK操作句柄
4.	    if (m_operateHandle == IntPtr.Zero)
5.	    { return ImvsSdkPFDefine.IMVS_EC_NULL_PTR; }
6.	 
7.	    ImvsSdkPFDefine.IMVS_PF_INPUT_IMAGE_INFO stImageInfo = new ImvsSdkPFDefine.IMVS_PF_INPUT_IMAGE_INFO();
8.	    stImageInfo.nDataType = 1;
9.	    stImageInfo.nModuleID = 16;//图像源模块序号
10.	    stImageInfo.strImagePath = "E:\\VSproject\\Demo\\12.jpg";
11.	 
12.	    ImvsPlatformSDK_API.IMVS_PF_SetImageData_CS(m_operateHandle, stImageInfo);
13.	 
14.	    //System.Threading.Thread.Sleep(200);
15.	 
16.	    //自定义执行逻辑
17.	    //流程1运行一次
18.	    int nRet = ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle, 10002, null);
19.	    return nRet;
20.	}

问题根因
不熟悉全局脚本相关接口。

1.3.8 全局脚本:通过全局脚本获取通讯输入的参数并赋值给全局变量

描述
环境:VM4.0.0及以上
现象:全局脚本根据外部通讯输入的数值赋值给全局变量,实现输入与全局变量之间的数值绑定。(一般应用于定位、标定等需要外界物理值的场景)
解答
第一步,在vm通讯管理中设置好通讯设备,连接。
在这里插入图片描述

第二步,根据通讯设备、接收的信息格式设置接收事件
在这里插入图片描述

第三步,在全局变量中设置中对应的变量
在这里插入图片描述

第四步,在全局脚本中根据输入的字符串进行分割设置对应的全局变量
在这里插入图片描述

成果展示:
实现模块直接绑定通讯输入的点位信息。
在这里插入图片描述
在这里插入图片描述

问题根因
不熟悉模块之间的业务关系。

1.3.9 全局脚本:VM加载方案后自动执行的方法

描述
环境:VM4.0.0
现象:如何让VM在方案加载后自动执行流程?
解答
可以通过全局脚本控制方案加载之后希望执行的操作,将如下代码添加到全局脚本中。

public override int InitAfterLoadSol()
{
  //加载方案完成信号,在方案加载回调函数中获取信号
  Sleep(500);
  //控制流程1执行一次       
  ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle, 10000, null);
  return 0;
}

问题根因
不熟悉全局脚本的方案控制。

1.3.10 全局脚本:多流程协作控制的方法

描述
环境:VM4.0及以上
现象:如何实现多流程间的协作控制,如:如何控制实现流程A、B执行完毕执行流程C的逻辑?
解答
1.可以使用全局脚本来实现多流程的协作控制,主要通过在流程运行状态回调中判断流程的执行状态来控制流程的执行,示例代码如下。

C#
using System;
using VM.GlobalScript.Methods;
using System.Linq;
using System.Windows.Forms;
using iMVS_6000PlatformSDKCS;
using System.Runtime.InteropServices;
using System.Threading;
using System.Collections.Generic;
using System.Threading.Tasks;

/*****************************************
 * 示例说明:该示例用于检测流程的运行状态来执行剩余的逻辑
 *         例如:流程0和流程1执行完之后需要执行流程2
 * ***************************************/
public class UserGlobalScript : UserGlobalMethods, IScriptMethods
{
    /// <summary>
    /// 初始化函数
    /// </summary>
    /// <returns>成功:返回0</returns>
    public int Init()
    {
        //二次开发SDK初始化
        InitSDK();
        //需要等待多少个流程就添加多少个
        objProcessStatusDict.Add(10000, new ProcessWorkStatus() { });
        objProcessStatusDict.Add(10001, new ProcessWorkStatus() { });
        return 0;
    }

    private Dictionary<uint, ProcessWorkStatus> objProcessStatusDict = new Dictionary<uint, ProcessWorkStatus>();

    /// <summary>
    /// 运行函数
    /// 单次执行:该函数执行一次
    /// 连续执行:以一定时间间隔重复执行该函数
    /// </summary>
    /// <returns>成功:返回0</returns>
    public int Process()
    {
        //m_operateHandle 二次开发SDK操作句柄
        if (m_operateHandle == IntPtr.Zero)
        { return ImvsSdkPFDefine.IMVS_EC_NULL_PTR; }

        //自定义执行逻辑 
        //默认执行全部流程,如果自定义流程执行逻辑,请移除DefaultExecuteProcess方法
        int nRet = DefaultExecuteProcess();

        return 0;
    }


    /// <summary>
    ///流程运行状态空闲回调
    /// </summary>
    /// <param name="workStatus"></param>
    public void ExecuteProcessWorkStatus(ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS workStatus)
    {
        try
        {
            //1为忙碌状态,0位空闲状态,为0时说明流程执行完毕
            if (objProcessStatusDict.ContainsKey(workStatus.nProcessID))
            {

                objProcessStatusDict[workStatus.nProcessID].Status = workStatus.nWorkStatus;
            }

            //如果都为true 说明已经执行过一次
            if (objProcessStatusDict.All(x => x.Value.IsExecute))
            {
                //全部置位
                foreach (var item in objProcessStatusDict)
                {
                    item.Value.IsExecute = false;
                }
                Task.Run(() =>
                {
                    //执行后续逻辑动作
                    ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle, 10002, null);
                });
            }
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.ToString());
        }
    }

    /// <summary>
    /// SDK回调函数
    /// </summary>
    public override void ResultDataCallBack(IntPtr outputPlatformInfo, IntPtr puser)
    {
        base.ResultDataCallBack(outputPlatformInfo, puser);
        ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO struInfo = (ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO)Marshal.PtrToStructure(outputPlatformInfo, typeof(ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO));
        switch (struInfo.nInfoType)
        {
            //获取模块结果数据
            case (uint)ImvsSdkPFDefine.IMVS_CTRLC_OUTPUT_PlATFORM_INFO_TYPE.IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_MODULE_RESULT:
                {
                    ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P resultInfo = (ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P)Marshal.PtrToStructure(struInfo.pData, typeof(ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P));
                    break;
                }
            ///获取流程运行状态
            case (uint)ImvsSdkPFDefine.IMVS_CTRLC_OUTPUT_PlATFORM_INFO_TYPE.IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_WORK_STATE:
                {
                    ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS stWorkStatus = (ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS)Marshal.PtrToStructure(struInfo.pData, typeof(ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS));
                    //处理流程运行状态
                    ExecuteProcessWorkStatus(stWorkStatus);
                    break;
                }
            default:
                break;
        }
    }
}

public class ProcessWorkStatus
{
    public ProcessWorkStatus()
    {
        IsExecute = false;
    }
    public bool IsExecute { get; set; }
    private uint _status;
    public uint Status
    {
        get { return _status; }
        set
        {
            if (_status != value)
            {
                IsExecute = (value == 0 && _status == 1);
                _status = value;
            }
        }
    }
}

问题根因
不熟悉全局脚本控制多流程的使用。

1.3.11 全局脚本:通过通讯触发快速匹配模块换型的方法

描述
环境:VM4.0及以上
现象:如何实现根据通讯信号切换快速匹配的模型文件并触发流程执行?
解答
1.动态切换模板需在全局脚本中调用相关接口实现,可以在全局脚本的通讯数据接收回调中实现代码逻辑,代码如下。

C#
using System; 
using VM.GlobalScript.Methods;
using System.Windows.Forms; 
using iMVS_6000PlatformSDKCS;
using System.Runtime.InteropServices;

/******************************
 * 示例说明: 接收全局通信模块数据示例
 *     前提: 全局通信模块中开启有通信设备
 * 控制逻辑: 1.接收来自全局通信模块接收到的数据
 *           2.如果接收到数据字符T1/T2,则加载对应模型文件并执行流程1一次
 * ***************************************/
public class UserGlobalScript : UserGlobalMethods, IScriptMethods
{
    /// <summary>
    /// 初始化函数
    /// </summary>
    /// <returns>成功:返回0</returns>
    public int Init()
    {
        //二次开发SDK初始化
        InitSDK();
        //设置与全局通信模块的通信端口
        StartGlobalCommunicate();
        //注册通信数据接收事件
        RegesiterReceiveCommunicateDataEvent();
        return 0;
    }

    /// <summary>
    /// 运行函数
    /// 单次执行:该函数执行一次
    /// 连续执行:以一定时间间隔重复执行该函数
    /// </summary>
    /// <returns>成功:返回0</returns>
    public int Process()
    {
        //m_operateHandle 二次开发SDK操作句柄
        if (m_operateHandle == IntPtr.Zero)
        { return ImvsSdkPFDefine.IMVS_EC_NULL_PTR; }
        //默认执行全部流程,如果自定义流程执行逻辑,请移除DefaultExecuteProcess方法
        int nRet = DefaultExecuteProcess();
        return nRet;
    }

    /// <summary>
    /// 通信数据接收函数
    /// </summary>
    public override void UserGlobalMethods_OnReceiveCommunicateDataEvent(ReceiveDataInfo dataInfo)
    {
        if (dataInfo == null || dataInfo.DeviceData == null)
        { return; }
        //接收到的数据转成字符串
        string str = System.Text.Encoding.Default.GetString(dataInfo.DeviceData);
        //创建导入模型结构体
        ImvsSdkPFDefine.IMVS_PF_IMPORT_MODULE_DATA_INPUT stImportData = new ImvsSdkPFDefine.IMVS_PF_IMPORT_MODULE_DATA_INPUT();
        stImportData.stImportModuData = new ImvsSdkPFDefine.IMVS_PF_IMPORT_MODULE_DATA[ImvsSdkPFDefine.IMVS_PF_MAX_IMPORT_NUM];
        //这里的deviceIndex和全局通信模块中的一致
        if (dataInfo.DeviceID == 1)
        {
            //解析收到的数据
            if (str == "T1")
            {
                //导入一个模板
                string strImportFilePath = "E:\\Project\\VMProject\\模板切换\\3.fmxml";
                stImportData.stImportModuData = new ImvsSdkPFDefine.IMVS_PF_IMPORT_MODULE_DATA[ImvsSdkPFDefine.IMVS_PF_MAX_IMPORT_NUM];
                stImportData.nDataNum = 1;
                stImportData.nDataType = 1;
                //操作模块ID
                stImportData.nModuleID = 1;
                stImportData.stImportModuData[0].pData = Marshal.StringToHGlobalAnsi(strImportFilePath);
                int iDataLen = System.Text.Encoding.Default.GetBytes(strImportFilePath).Length;
                stImportData.stImportModuData[0].nDataLen = (uint)iDataLen;
            }
            if (str == "T2")
            {
                //创建模型文件字符串数组,同时导入两个模板
                string[] strImportFilePath = new System.String[] { "E:\\Project\\VMProject\\模板切换\\1.fmxml", "E:\\Project\\VMProject\\模板切换\\2.fmxml" };
                stImportData.nDataNum = 2;
                stImportData.nDataType = 1;
                stImportData.nModuleID = 1;
                int count = 0;
                foreach (var iter in strImportFilePath)
                {
                    stImportData.stImportModuData[count].pData = Marshal.StringToHGlobalAnsi(iter);
                    int iDataLen = System.Text.Encoding.Default.GetBytes(iter).Length;
                    stImportData.stImportModuData[count].nDataLen = (uint)iDataLen;
                    count++;
                }
            }
            //导入模型
            ImvsPlatformSDK_API.IMVS_PF_ImportModuleData_CS(m_operateHandle, stImportData);
            //执行流程1                  
            ImvsPlatformSDK_API.IMVS_PF_ExecuteOnce_V30_CS(m_operateHandle, 10000, null);
        }
    }

    /// <summary>
    /// SDK回调函数
    /// </summary>
    public override void ResultDataCallBack(IntPtr outputPlatformInfo, IntPtr puser)
    {
        base.ResultDataCallBack(outputPlatformInfo, puser);
        ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO struInfo = (ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO)Marshal.PtrToStructure(outputPlatformInfo, typeof(ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO));
        switch (struInfo.nInfoType)
        {
            //获取模块结果数据
            case (uint)ImvsSdkPFDefine.IMVS_CTRLC_OUTPUT_PlATFORM_INFO_TYPE.IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_MODULE_RESULT:
                {
                    ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P resultInfo = (ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P)Marshal.PtrToStructure(struInfo.pData, typeof(ImvsSdkPFDefine.IMVS_PF_MODULE_RESULT_INFO_LIST_P));
                    break;
                }
            ///获取流程运行状态
            case (uint)ImvsSdkPFDefine.IMVS_CTRLC_OUTPUT_PlATFORM_INFO_TYPE.IMVS_ENUM_CTRLC_OUTPUT_PLATFORM_INFO_WORK_STATE:
                {
                    ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS stWorkStatus = (ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS)Marshal.PtrToStructure(struInfo.pData, typeof(ImvsSdkPFDefine.IMVS_PF_MODULE_WORK_STAUS));
                    break;
                }
            default:
                break;
        }
    }
}

问题根因
不熟悉全局脚本通讯回调及模板导入相关接口的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/473931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我做了个GPT3键盘,用了两个月发现它有点傻

自 ChatGPT 出世&#xff0c;各类文本类AI产品层出不穷。甚至接连几日&#xff0c;Producthunt 上新品过半都是AI相关。 这其中部分原因是 OpenAI 公司开放的 GPT3 1API 接口十分易用。只要一个简单的文本请求&#xff0c;就能将现有产品加入AI功能。例如&#xff0c;Notion、…

Docker在Windows系统中的安装方法和使用方法

Docker在Windows系统中的安装方法和使用方法 Docker是一种容器化技术&#xff0c;可以让开发者将应用程序和其依赖项打包成一个可移植的容器&#xff0c;从而实现快速部署和运行。在Windows系统中&#xff0c;Docker可以通过以下步骤进行安装和使用。 优点&#xff1a; Dock…

【VM服务管家】VM4.x算子SDK开发_3.3 模块工具类

目录 3.3.1 位置修正&#xff1a;位置修正算子工具的使用方法3.3.2 模板保存&#xff1a;实现模板自动加载的方法3.3.3 模板匹配&#xff1a; 获取模板匹配框和轮廓点的方法3.3.4 模板训练&#xff1a;模板训练执行完成的判断方法3.3.5 图像相减&#xff1a;算子SDK开发图像相减…

浅谈软件质量与度量

本文从研发角度探讨下高质量软件应具备哪些特点&#xff0c;以及如何度量软件质量。 软件质量的分类 软件质量通常可以分为&#xff1a;内部质量和外部质量。 内部质量 内部质量是指软件的结构和代码质量&#xff0c;以及其是否适合维护、扩展和重构。它关注的是软件本身的…

数据结构 | 常见的数据结构是怎样的?

本文简单总结数据结构的概念及常见的数据结构种类 1’ 2。 更新&#xff1a;2023 / 04 / 05 数据结构 | 常见的数据结构是怎样的&#xff1f; 总览概念分类 常用的数据结构数组链表跳表栈队列树二叉树完全二叉树、满二叉树 平衡二叉树单旋转左旋右旋 红黑树红黑树 V.S 平衡二叉…

2 天:我用文字 AI-ChatGPT 写了绘画 AI-Stable Diffusion 跨平台绘画应用

文本 AI - ChatGPT 和绘画 AI - Stable Diffusion&#xff0c;平地惊雷&#xff0c;突然进入寻常百姓家。 如果时间可以快进&#xff0c;未来的人们对于我们这段时光的历史评价&#xff0c;大概会说&#xff1a; 当时的人们在短时间连续经历了这几种情感。从不信&#xff0c;…

java多线程BlockingDeque的三种线程安全正确退出方法

本文介绍两种BlockingDeque在多线程任务处理时正确结束的方法 一般最开始简单的多线程处理任务过程 把总任务放入BlockingDeque创建多个线程&#xff0c;每个线程内逻辑时&#xff0c;判断BlockingDeque任务是否处理完&#xff0c;处理完退出&#xff0c;还有任务就BlockingDe…

对顶堆模板!!【DS对顶堆】ABC281 E - Least Elements

我想的思路和正解是差不多的 就是滑动窗口&#xff0c;每过去一个用DS维护一下前k个元素和sum 本来想的是用优先队列维护前k个 然后想着multiset维护前k个&#xff0c;但是具体不知道怎么操作 这里用的是multiset维护对顶堆 关于对顶堆&#xff0c;我在寒假的时候总结过 …

【Java笔试强训】(1)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f9be;&#x1f9be;&#x1f9be; 目录 一、选择题 二、编程题 &#x1f525;组队竞…

Github创建一个新仓库,关联本地数据并上传文件的图文步骤

工作中&#xff0c;我们经常会使用github来承享别人的代码果实&#xff0c;同时我们也会把自己的成果分享给别人&#xff0c;互相帮助。 今天的这篇图文教程非常重要&#xff0c;目标是使用Github来创建一个远程仓库&#xff0c;并和本地仓库对接&#xff0c;同时要做上传新内容…

初始Vue3【Vue3】

1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-next/releases/tag/v3.0.0 …

使用docker容器化部署mysql8.0.27,并更改其默认端口3306为3306全流程记录。

使用docker容器化部署mysql8.0.27,并更改其默认端口3306为3306全流程记录。 1.创建镜像 #查看镜像 docker images|grep mysql #搜索镜像 docker search mysql #拉取镜像 docker pull mysql&#xff1a;latest #运行镜像&#xff0c;--name 后的参数自己命名&#xff0c;我的数…

js逆向之rpc远程调用(你强任你强,我无视一切)

一、找到加密函数位置 二、在其下面注入ws服务 &#xff08;1)注入准备 资源>>替换>>随便选一个空文件夹 &#xff08;2&#xff09;进行注入 进行&#xff08;1&#xff09;操作后可直接编辑js代码了&#xff0c;做以下修改 (function() {var ws new WebSocket(…

ChatGPT实现代码生成

代码生成 就代码生成而言&#xff0c;ChatGPT 是一款卓越的工具&#xff0c;它为开发者提供强大的功能。ChatGPT 可以运用其出色的自然语言处理技术&#xff0c;深入理解和解释开发者的需求&#xff0c;快速生成适合的代码片段。对于那些繁琐的任务或者重复的代码&#xff0c;…

肝一肝设计模式【三】-- 原型模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 文章目录 系列文章目录前言一、什么是原型模式二、浅克隆三、深克隆写在最后 前言 前文中我们知道设计模式可以分为三大类&#xff1a;创建型模式、结构型模式、行为型模式。创…

Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C#)

项目场景&#xff1a; Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0…

tp6.1 bingher/ueditor(百度编辑器)(七牛、阿里OSS第三方云)详情图文教程(2023年第二版)

之前做过一版&#xff1a;tp6 bingher/ueditor(百度编辑器)(七牛、阿里OSS第三方云)详情图文教程_我是高手高手高高手的博客-CSDN博客 登录权限是Session&#xff0c;现在系统是Cookie加jwt的Token方式验证 一、修改验证登录权限 修改文件&#xff1a; vendor\bingher\uedito…

react native ios 添加启动页 xcode14 react-native-splash-screen

最近更新xcode&#xff0c;有些配置有些不同&#xff0c;网上查的方法都是过时的&#xff0c;导致配了一段时间卡在这里&#xff0c;最后访问官网才弄好了&#xff0c;所以以后解决问题的办法先看官网再查其他各路神仙的办法。 官网的步骤&#xff1a;https://github.com/crazy…

ChatGPT原理剖析

文章目录 ChatGPT常见误解1. 罐头回应2. 网络搜寻重组 ChatGPT真正做的事——文字接龙ChatGPT背后的关键技术——预训练&#xff08;Pre-train&#xff09;一般机器是怎样学习的&#xff1f; ChatGPT带来的研究问题1. 如何精准提出需求2. 如何更改错误3. 侦测AI生成的物件4. 不…

众人围剿,GPT-5招惹了谁

目录 千人呼吁暂停AI训练代表人物分析反对原因分析信息安全人身安全失业利益 总结 GPT-4 火爆全球&#xff0c;引发了人工智能大浪潮。过去的一个月&#xff0c;OpenAI、微软、谷歌加上百度不断释放王炸&#xff0c;所有人都相信&#xff0c;AI 的就是未来的生产力。俗话说&…