自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

強雲的博客

網上人生

  • 博客(119)
  • 资源 (2)
  • 收藏
  • 关注

原创 Qt多线程

Qt 提供了多种方式来处理多线程编程,它不仅使多线程操作更易于管理,还与 Qt 的事件驱动架构紧密集成。下面是 Qt 多线程编程的详细介绍,包括关键类、模式以及常见的使用场景。

2024-08-29 14:22:00 883 1

原创 工业软件架构5:(QT和C++实现)

通过使用QWaitCondition和QMutex,你可以灵活地控制任务的执行、暂停和继续。这样的设计适用于需要动态管理任务状态的应用场景,如需要中断并稍后继续的长时间运行任务。可暂停性: 任务可以在执行过程中被暂停,等待条件满足后再继续执行。可恢复性: 任务在暂停后可以继续从暂停点执行,而无需重新启动任务。线程安全: 使用QMutex确保状态检查和状态改变的线程安全,避免竞争条件。分步骤执行: 将任务分解为多个步骤,每个步骤之间插入状态检查点,确保任务能够响应暂停和继续操作。

2024-08-29 11:43:22 1238

原创 C++ lambda表达式

Lambda 表达式是 C++ 中非常强大和灵活的功能,允许在需要时定义小型匿名函数,特别适用于回调、并发操作和 STL 算法中。它们使代码更简洁,更易于维护。

2024-08-28 11:38:21 493

原创 C++ 原子操作为什么使用 .load() 和 .store()

使用 load() 和 store() 而不是 = 的原因主要在于它们能清楚地表达出原子操作的意图,使代码在多线程环境下更安全、更可读,并提供了跨平台一致性和更丰富的内存序选项。如果代码涉及到多线程,并希望确保线程安全性,那么尽量使用 .load() 和 .store(),即使 = 操作符在很多情况下也能工作。

2024-08-28 11:30:57 315

原创 工业软件架构4:(QT和C++实现)

定义任务类,任务在执行前需要先检查依赖管理器,以决定是否可以开始执行。public:// 模拟任务A的耗时操作private:public:// 等待任务A完成// 模拟任务B的耗时操作private:public:// 等待任务A完成// 等待任务B完成// 模拟任务C的耗时操作private:通过引入 TaskDependencyManager 来管理任务之间的依赖关系和状态,可以确保任务按照预期的顺序执行,并防止在不适当的情况下启动某些任务。

2024-08-28 09:48:24 418

原创 工业软件架构3:(QT和C++实现)

QThreadPool 和 QRunnable: 适合简单的并行任务管理,直接将任务分配给线程池执行。QFuture 和 QFutureWatcher: 提供了更高级的任务监控和管理方式,适合需要监听任务完成状态的场景。命令模式: 可以将复杂的任务逻辑封装为命令对象,结合线程池或异步任务框架执行,增强代码的可维护性。错误处理与状态监控: 通过信号与槽机制实时监控任务状态,处理错误,确保系统的稳定性和响应性。

2024-08-26 17:49:40 1314

原创 工业软件架构2:(QT和C++实现)

首先,我们定义一个 Command 接口,该接口声明了 execute() 方法。public:命令模式通过将操作封装为对象,解耦了请求的发出者与接收者,使得系统具有更好的灵活性和可扩展性。需要对操作进行参数化:将操作封装为命令对象,允许操作参数化。需要在不同时间执行操作:命令对象可以在创建时延迟执行,或者通过队列机制进行排队执行。需要支持撤销/重做:命令对象可以记录操作状态,允许撤销和重做操作。需要记录日志:通过命令模式,可以轻松记录操作日志,并在需要时重放这些操作。

2024-08-26 17:23:52 1311

原创 工业软件架构1:(QT和C++实现)

这个架构充分考虑了实时性、模块化、和可扩展性,适应了复杂硬件环境下的多功能需求。模块化设计:各个功能通过模块化设计进行管理,减少耦合度,增加系统的灵活性。事件驱动:事件总线在各模块间传递事件,实现模块间的松耦合和实时通信。实时响应:传感器数据、硬件状态和按键操作均通过事件总线实时更新,确保系统的及时响应。界面管理:使用 QStackedWidget 管理多个页面,并通过事件总线实现页面的动态切换和更新。参数管理:文件系统与应用程序参数保持同步,确保参数的一致性和持久性。

2024-08-26 16:32:52 1139

原创 使用 QThread 而不是 std::thread

对于绝大多数基于 Qt 的应用程序开发,特别是涉及到 UI 和信号槽机制的场景,QThread 提供了更好的集成、简化的线程管理以及丰富的功能支持。因此,使用 QThread 通常是更好的选择。

2024-08-26 15:40:29 658

原创 事件驱动架构

事件驱动架构(Event-Driven Architecture, EDA)是一种软件架构模式,它通过事件来驱动系统的运行。事件是一种状态变化的通知,例如用户的操作、传感器的数据变化或系统内部的消息。事件驱动架构的核心思想是,当某个事件发生时,系统能够自动触发相应的处理程序(事件处理器)来响应该事件。在工业自动化中,事件驱动架构特别适合处理实时数据、传感器输入、设备控制等场景,能够实现对外部事件的快速响应。

2024-08-26 15:35:29 315

原创 Qt动态调用 - QMetaObject::invokeMethod

动态调用是 Qt 的元对象系统的一项强大功能,它允许在运行时通过名称调用槽函数、信号和普通成员函数。这种能力对于构建灵活和可扩展的应用程序非常有用,比如插件系统或脚本接口。

2024-08-08 15:05:29 704

原创 QString

概述QString是Qt框架中的一个类,提供了处理和操作字符串的便捷接口。它是任何处理文本的应用程序中必不可少的类,提供了广泛的功能来高效地管理Unicode字符串。

2024-07-10 10:56:37 303

原创 std::future和std::promise

和std::promise`是C++11引入的库,用于线程之间的异步通信和结果传递。它们特别适合在不同线程之间传递数据或异常。下面是它们的详细介绍和使用方法。

2024-05-28 10:00:17 493

原创 c++多线程异常

在C++中,捕获线程抛出的异常需要特别注意,因为默认情况下,如果一个线程抛出异常并且没有被捕获,整个程序可能会终止。

2024-05-28 09:59:12 355

原创 Qt连接所有同类部件到同一个槽函数

【代码】Qt连接所有同类部件到同一个槽函数。

2024-03-08 15:27:11 705

原创 C++ : std::is_same和std::is_same_v

std::is_same和std::is_same_v是C++标准库中的类型特性,用于在编译时检查两个类型是否相同。它们都属于<type_traits>头文件。这两个工具非常有用,特别是在模板编程和编译时类型检查中,它们可以帮助实现基于类型的条件编译和编译时决策。

2024-03-08 14:36:08 2593

原创 C++ constexpr

constexpr是C++11引入的一个关键字,用于声明变量、函数或对象构造函数的表达式在编译时是常量表达式。这意味着它们的值或行为可以在编译时被确定,而不是在运行时。这样做的主要好处是提高性能,因为编译器可以优化这些常量表达式,甚至在编译时执行计算,而不是推迟到运行时。

2024-03-08 14:33:03 446

原创 crypto++下载、安装(VS2017)及加解密使用

Crypto++(也称为Crypto++ Library或Crypto++ STL)是一个C++密码学库,它提供了各种密码学算法和安全编程工具,使开发人员能够实现数据的加密、解密、签名、验证和其他密码学操作。Crypto++是一个开源项目,具有广泛的应用领域,包括网络通信、数据存储、安全协议、数字签名、加密文件系统等。

2023-09-18 15:21:24 2532

原创 c++ 17 std::optional

是C++17引入的一个模板类,旨在表示一个值可能存在或可能不存在,而不是使用特定的标记值或指针(例如nullptr)来表示值的缺失。以下是。

2023-09-18 14:34:23 243

原创 c++ 17 std::optional

是C++17引入的一个模板类,旨在表示一个值可能存在或可能不存在,而不是使用特定的标记值或指针(例如nullptr)来表示值的缺失。以下是。

2023-08-25 15:51:47 244

原创 c++ inline

关键字在C++中提供了一种优化机会,但应该谨慎使用,避免过度使用。关键字有几个主要用途和含义。

2023-08-24 11:09:50 166

原创 异常分布设计

异常处理是软件设计中的一个重要方面,正确的策略可以使代码更具可读性、可维护性和健壮性。这种策略的好处是结合了集中和分散两种策略的优点,使得代码既具有模块化的优点,又能保持一致性和可维护性。

2023-08-24 11:04:26 107

原创 什么时候写入日志

总的来说,日志的目标是为开发者、运维人员或其他关心应用行为的人提供足够的上下文信息,以便他们可以理解应用的行为、诊断问题或进行审计。不过,也要注意不要记录过多的日志,以避免对性能的影响,也要避免记录敏感信息,以保护用户隐私和应用安全。记录日志的决策通常取决于日志的目的和你希望从日志中获得的信息。

2023-08-24 10:51:56 111

原创 C++命名规范

这只是一个基本的命名规范。在实际开发中,根据项目和团队的具体情况,可能需要调整或扩展这些规则。最重要的是,团队中的每个成员都应遵循同一套规则,并确保代码在整个项目中保持一致性。

2023-08-23 17:19:59 650 1

原创 C++注释风格

每个文件都应该开始于一个注释块,描述文件的目的、作者、创建日期和版权信息。

2023-08-23 17:18:37 213

原创 c++ 异常规范

在C++中,可以在函数声明后指明可能会抛出的异常类型。但是,异常规范的使用是有争议的,而且在某些情况下可能会引发不预期的问题。:当函数实现变更时,异常规范可能需要重新评估和更新,这可能会导致维护问题。:异常规范限制了函数可能抛出的异常类型。如果函数抛出了异常规范外的异常,:在某些编译器和平台上,异常规范可能导致额外的运行时开销。对性能的影响更为正面,并且在现代C++编码中更为推荐。这可能导致程序意外地终止。规范,它表示函数不会抛出异常。:从C++11开始,引入了。

2023-08-23 17:14:50 170

原创 c++ hpp文件

但是,有些社区和项目有明确的约定。如果你正在创建一个库或框架供其他开发者使用,可能还需要考虑目标受众的期望和习惯。例如,如果目标用户主要是C开发者,那么使用。,最重要的是保持项目中的一致性。当决定为新项目选择哪种格式时,最好考虑项目团队的偏好、已有的代码库、所使用的工具链等因素。扩展名明确表示该文件是C++头文件,而不是C头文件。这可以减少混淆,尤其是在同时涉及C和C++的项目中。最终,选择哪种扩展名并不是一个硬性的规定,关键是确保你的代码清晰、一致和易于维护。不过,在实践中,无论使用。

2023-08-22 14:40:37 547

原创 c++ 枚举类

在C++11及其后续版本中,引入了一个新的枚举类型称为“强类型枚举”或“枚举类”(enumeration class),通常简称为“枚举类”(enum class)。语句中有个好处:它使得代码更具可读性,因为你必须明确引用枚举的名称。语句处理所有的枚举值,编译器可能会给出警告(取决于编译器设置和所使用的编译器)。在上述代码中,我们定义了一个。以下是一个例子来展示如何在。语句来处理其不同的值。

2023-08-22 14:39:15 255

原创 c++函数参数太多,如何指定参数

当一个函数有很多参数,特别是当某些参数有默认值时,调用该函数并为特定参数提供值可能会变得混乱和易错。从上述选项中选择最适合你应用程序的方法。如果参数是固定且经常一起使用的,第一种方法可能是最佳选择。如果参数经常变化或有许多可选的参数,第二或第三种方法可能更合适。请注意,这只是一个想法,实际上C++20之前的标准并不支持此语法。将相关参数组合到一个结构体或类中,并传递该结构体或类的实例。,但这通常适用于动态参数列表,可能会稍微牺牲一些性能。这通常在类的构造函数或某些配置函数中使用。

2023-08-22 14:37:17 1537

原创 c++命名空间

使用namespace。

2023-08-22 14:36:43 185

原创 c++命名空间

使用namespace。

2023-08-22 14:34:20 158

原创 const 和 constexpr

使用const和constexpr可以增强代码的可读性和安全性。const确保值或对象不被修改,而constexpr则确保值或函数在编译时被评估,这在某些情况下可以提供性能优势。

2023-08-22 14:31:16 102

原创 c++使用回调函数

如果你的类有多个实例,必须确保只有一个实例修改和使用这个静态指针。否则,你可能会遇到意料之外的行为。确保在不需要它的时候适当地管理这个静态指针,例如,避免在对象被销毁后访问它。:应用是多线程的,这种策略可能不是线程安全的。当在C++中使用回调时,非静态成员函数与静态成员函数(或全局函数)之间有明显的差异,这些差异决定了各自的优劣。但如果项目中需要更多的灵活性,或预见到未来可能需要对回调进行更复杂的管理和配置,那么。总的来说,不同的策略有其各自的优点和缺点,选择哪一种取决于具体的应用场景和优先级。

2023-08-22 14:24:26 325

原创 std::function与 std::bind

是一个模板类,可以存储任意类型的可调用对象(如函数、lambda表达式、函数对象、成员函数指针等)。其最大的优势是提供了一种通用、多态的方式来存储、复制和调用这些可调用对象。它通常与std::bind或 lambda 一起使用来存储已绑定参数的函数调用。

2023-08-22 14:23:40 97

原创 常用的图像校正方法

在数字图像处理中,常用的校正方法包括明场均匀性校正、查找表(LUT)校正和伽玛(Gamma)校正。这些校正方法分别针对不同的图像问题,可以改善图像质量,提升图像的可读性和可分析性。

2023-08-18 09:53:54 2575

原创 TDI(Time Delay Integration)

TDI(Time Delay Integration)是一种特殊的图像采集技术,常用于线阵CCD(Charge-Coupled Device)相机。TDI技术可以在保持高分辨率的同时增强图像的信噪比(Signal-to-Noise Ratio, SNR),从而在低光条件下获取更清晰、更明亮的图像。这种技术主要应用于需要高速、高灵敏度和高分辨率的场合,例如卫星遥感、工业检测和科学研究等。

2023-08-18 09:50:38 4447

原创 Camera Link 接口

Camera Link是一个标准的接口协议,用于高速的图像数据传输,常被用在工业相机和图像处理系统之间。需要注意的是,尽管Camera Link接口具有许多优势,但其较高的成本和有时需要专业知识的安装和配置,使得它可能不适用于所有的应用场景。随着新的接口标准,如USB3 Vision和GigE Vision的出现,一些应用已经开始向这些更灵活和经济的解决方案转移。它可以支持从20兆字节/秒(MBps)到850兆字节/秒(MBps)的数据传输速率,这使得它适用于高分辨率和高帧率的图像采集应用。

2023-08-18 09:47:41 2900

原创 组合模式(Composite Pattern)

组合模式使得客户端可以以统一的方式处理单个对象和组合对象。组合模式的主要思想是将对象组织成树状结构,使得单个对象和组合对象具有一致的接口。这样一来,客户端可以透明地操作单个对象或组合对象,无需关心具体是处理的是单个对象还是组合对象。)定义了组合对象和叶节点对象的公共接口。组合节点对象是部门对象,它可以包含多个子节点(即员工对象),并实现了组件接口。组合模式可以使得对象的组织结构更加灵活,支持递归组合,以及统一处理整体和部分。通过组合模式,我们可以透明地处理部门和员工,客户端可以以统一的方式调用它们的接口。

2023-07-11 10:58:14 304

原创 桥接模式(Bridge Pattern)

桥接模式可以提高系统的灵活性和可扩展性,使得抽象部分和实现部分能够独立演化。它适用于需要多个维度变化的场景,例如图形和颜色之间的关系,可以灵活地添加新的图形或颜色而不需要修改现有代码。通过桥接模式,我们可以独立地扩展图形类和颜色类,它们可以独立变化而不相互影响。在示例中,我们创建了一个红色的圆和一个蓝色的正方形,并调用它们的绘制方法,分别输出对应的颜色和图形信息。通过桥接模式,抽象部分和实现部分可以独立地扩展,而不会相互影响。图形类包含对实现部分的引用(颜色),并定义了绘制图形的方法。)和它的具体实现类(

2023-07-11 10:49:08 359

原创 适配器模式(Adapter Pattern)

适配器模式可以帮助我们解决接口不兼容的问题,使不兼容的类能够一起工作。它提供了一种灵活的方式来适配现有类的接口,以满足客户端的需求。适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换为另一个类的接口,以满足客户端的需求。适配器模式的主要目的是使不兼容的接口能够协同工作。它通过创建一个适配器类,该适配器类包装了现有类的接口,使其与目标接口相匹配。然而,我们希望使用该类来计算正方形的面积,这就需要创建一个适配器类。函数中,我们使用适配器类来创建一个适配器对象,并通过调用。

2023-07-11 10:41:31 647

python_文件夹操作中的exe文件

自动生成文件夹 名字为 **年_月_日_时_分_序列号** 序列号从1开始,升序排列。

2022-01-24

模式分类第二版英文版

模式识别最好的入门书籍。

2018-09-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除