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

2024-04-22 10:12

本文主要是介绍上位机工作感想-从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#写代码也是非常开心的一件事。
数据看板实图

这篇关于上位机工作感想-从C#到Qt的转变-1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925499

相关文章

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

C#中的 StreamReader/StreamWriter 使用示例详解

《C#中的StreamReader/StreamWriter使用示例详解》在C#开发中,StreamReader和StreamWriter是处理文本文件的核心类,属于System.IO命名空间,本... 目录前言一、什么是 StreamReader 和 StreamWriter?1. 定义2. 特点3. 用

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd