2.5 C#视觉程序开发实例1----开始设计架构一个简单的程序

news/2024/7/8 8:19:01 标签: c#, 架构, 开发语言

2.5 C#视觉程序开发实例1----开始设计架构一个简单的程序

第一步目标:
1 IO交互:读取IO 并且显示
2 相机采集线程: In[0]上升沿,采集图像, 通知处理线程显示图片
3 图像处理线程: 接受信号,显示图像

1 显示布局

在这里插入图片描述

2 程序逻辑图

目标: 程序初始化时 ,开启4个线程
1 IO 交互线程
2 相机采集线程
3 相机处理线程
4 Timer现成
在这里插入图片描述

3 CreateThread 创建线程

3.1 创建线程名称和ResetEvent
 // 程序退出标志
ManualResetEvent StopProgramEvent;
AutoResetEvent newImgEvent_thread;// 图像采集线程通知ImgProcess Event 
// ImgProcess线程
public Task threadProcessCCD;
// 相机采集线程  IO扫描线程  
public Task threadAcqCCD_0, IO_Thread;
3.2 创建线程
/// <summary>
/// 启动线程
/// remark:
/// </summary>
private void CreateThread()   //启动线程
{
    try
    {
        StopProgramEvent.Reset(); 
        // Thread_Status();
        // 必须开启的线程
        threadAcqCCD_0 = new Task(() => ImgAcqRunCCD0(), TaskCreationOptions.LongRunning);
        threadAcqCCD_0.Start();
         IO_Thread = new Task(() => IO_Circle(), TaskCreationOptions.LongRunning);
         IO_Thread.Start(); 
    }
    catch (Exception ex)
    {
        MessageBox.Show("Create Thread Error:" + ex.Message);
    }
}

public Form_vision()
  {
      InitializeComponent();
      bdDisplay_Runsets1.ResultVisible = false;
      Form_vision_SizeChanged(this,null); 
      iO_Monitors1.Init(ref inputs,ref outputs);

      // 创建线程
      CreateThread();
      timer1.Interval = 100;
      timer1.Start(); 
  }

4 创建4个线程函数

暂时内容为空

#region IO  Thread
/// <summary>
/// IO_Circle
/// </summary>
private void IO_Circle()
{ 
    while (true)
    { 
       // readInputs
       // writeOutputs 
        System.Threading.Thread.Sleep(20);

        if (StopProgramEvent.WaitOne(0, true)) break;
    }//end while  
}
#endregion 
#region ImgAcqRun  Thread
/// <summary>
/// IO_Circle
/// </summary>
private void ImgAcqRunCCD0()
{
    int n_trig0_cur=0, n_trig0_last=0;
    while (true)
    {
        try
        {
            // 通过判断上升沿进行 相机采集
            if (n_trig0_cur > 0 && n_trig0_last == 0)  //判断上升沿触发
            {
                //相机采集
                int nRet = 0;

                if(nRet==0)
                {
                    newImgEvent_thread.Set();
                }
            }

        }//try
        catch (Exception ex)
        {
            this.TopMost = false;
        } 
        if (StopProgramEvent.WaitOne(0, true)) break;
        n_trig0_last = n_trig0_cur;
        System.Threading.Thread.Sleep(5);

    }//end while  
}


#endregion 
#region ImgProcessRun  Thread
/// <summary>
/// ImgProcessCCD0
///  remark: thread 图像process0
/// </summary>
private void ImgProcessCCD(int n_thread_index = 0)
{
    ListViewItem DATA = new ListViewItem();
    DateTime ts3 = DateTime.Now; 

    bool[] flag = new bool[100];  
    DateTime current = DateTime.Now; 
    while ( newImgEvent_thread.WaitOne())   //相机1&2都已经已拍照
    {
        // img  process 
        if (StopProgramEvent.WaitOne(0, true)) break;
    } //end while 
    return;
}
#endregion ImgProcessRun  Thread

Timer1 定时器 主要目的 持续更新IO输入输出的状态

private void timer1_Tick(object sender, EventArgs e)
{
    iO_Monitors1.update_status(true,true);
}

5 线程退出

private void StopThread()   //停止线程
{
    StopProgramEvent.Set(); 
}
private void Form_vision_FormClosing(object sender, FormClosingEventArgs e)
{
    StopThread();
    Task.WaitAll();
}

6 下面 一步一步我们来添加功能

6.1 IO_Manager 实现IO的读取和输出以及心跳
6.2 Cam_Manager 实现文件的本地读取,模拟没有相机连接时的采集
6.2 GV_Manager 内存公共变量的管理

http://www.niftyadmin.cn/n/5536840.html

相关文章

Map Set(Java篇详解)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;Java专栏&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ 等 &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支持…

精通SQL Server端口管理:添加与删除监听端口的指南

引言 SQL Server的端口管理是数据库管理员(DBA)必须掌握的关键技能之一。端口配置不仅关系到数据库的网络通信能力&#xff0c;还直接影响到数据库的安全性和性能。本文将详细介绍如何在SQL Server中添加和删除监听端口&#xff0c;以及相关的配置策略和最佳实践。 SQL Serve…

谷粒商城学习笔记-05-项目微服务划分图

文章目录 一&#xff0c;商城业务服务-前端服务二&#xff0c;商城业务服务-后端服务三&#xff0c;存储服务四&#xff0c;第三方服务五&#xff0c;服务治理六&#xff0c;日志七&#xff0c;监控预警系统1&#xff0c;Prometheus2&#xff0c;Grafana3&#xff0c;Prometheu…

手写SpringMVC之调度器DispatcherServlet

DispatcherServlet&#xff1a;分发、调度 根据上一节&#xff0c;已经实现了将controller的方法添加到容器中&#xff0c;而DispatcherServlet的作用就是接收来自客户端的请求&#xff0c;然后通过URI的组合&#xff0c;来找到对应的RequestMapping注解的方法&#xff0c;调用…

Ubuntu20.04突然没网的一种解决办法

本来要学一下点云地图处理&#xff0c;用octomap库&#xff0c;但是提示少了octomap-server库&#xff0c;然后通过下面命令安装的时候&#xff1a; sudo apt install ros-noetic-octomap-server 提示&#xff1a;错误:7 https://mirrors.ustc.edu.cn/ubuntu focal-security …

电商数据仓库

1.数据仓库的数据来源为业务数据库&#xff08;mysql&#xff09; 2.通过sqoop将mysql中的业务数据导入到大数据平台&#xff08;hive&#xff09; 3.通过hive进行数据计算和数据分析 形成数据报表 4.再通过sqoop将数据报表导出到mysql 5.使用FineReport制作数据报表 1.数据…

Pytorch实战(二):VGG神经网络

文章目录 一、诞生背景二、VGG网络结构2.1VGG块2.2网络运行流程2.3总结 三、实战3.1搭建模型3.2模型训练3.3训练结果可视化3.4模型参数初始化 一、诞生背景 从网络结构中可看出&#xff0c;所有版本VGG均全部使用33大小、步长为1的小卷积核&#xff0c;33卷积核同时也是最小的能…

[Day 20] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI在醫療領域的創新應用 隨著科技的快速發展&#xff0c;人工智能&#xff08;AI&#xff09;在各行各業的應用越來越廣泛&#xff0c;醫療領域也不例外。AI技術在醫療中的應用不僅提高了診斷的準確性&#xff0c;還改善了病患的治療效果&#xff0c;優化了醫療資源的配置。本…