- 博客(473)
- 资源 (1)
- 收藏
- 关注

原创 二进制人工智能 博客精选
机器学习的数学基础机器学习PytorchPython信号与系统图像处理与计算机视觉OpenCV C++ Python
2022-06-04 19:09:16
3275
1
原创 【QT5 网络编程示例】TCP 通信
是 Qt 提供的 TCP 服务器类,它主要用于监听和接受客户端连接。是 Qt 提供的套接字类,看用于建立、管理和操作 TCP 连接。客户端连接服务器并发送。服务器收到消息后打印,并向客户端发送。两个类实现服务器和客户端的TCP 通信。客户端收到服务器消息后打印。
2025-03-31 18:49:07
404
原创 【QT5 多线程示例】异步编程
QFuture是 Qt 并发框架提供的一个异步计算结果的类。它允许你在后台执行任务,并在未来某个时刻获取任务的计算结果。QFuture通常与或适用于异步执行一个函数并通过QFuture的result()方法获取结果(调用result()会阻塞当前线程,直到获取结果)。允许监听QFuture的完成状态。如果你不想阻塞线程,而是希望在任务完成后收到通知,可以使用和信号槽机制获取结果。
2025-03-28 10:00:59
422
原创 【QT5 多线程示例】信号量
程序中设置了消费者取走数据的速度比生产者慢,因此可以看到 buffer 被逐步填满,之后再被逐步消费的情况。为了限定最大计数,可以采用两个。这确保了生产者生产的数据不会超过缓冲区的大小。下面使用一个生成者-消费者例子展示。确保生产者生产的数据不会超过缓冲区大小。的计数有一个加一就有一个减一,保证了。确保消费者不会读取空数据。,用法与C++标准中的。保持生产消费的平衡。
2025-03-25 20:19:32
432
原创 【QT5 多线程示例】条件变量
声明为静态变量,在多个 MyWorker实例间共享。有 3 个工作线程 在。只唤醒其中一个线程。有 3 个工作线程在。
2025-03-24 20:03:31
275
原创 【QT5 多线程示例】互斥锁
的用法差不多,而且也是基于 RAII(Resource Acquisition Is Initialization)机制的,在构造时自动锁定互斥量,在析构时自动解锁。自动管理互斥锁更为安全和方便。是因为 Qt 的信号和槽机制自动管理了线程的生命周期。在简单的函数中,可以直接使用 QMutex 的。,避免了多个线程同时执行这些操作导致的错误。能够自动管理局部作用域内互斥锁的加锁和开锁。,线程在任务完成后自动退出并清理资源。但在复杂的函数中,使用。另外,在这段代码中,不需要调用。互斥锁在代码中保护了。
2025-03-20 17:08:59
581
原创 【QT5 Widgets示例】Model/View编程初探
对于那些操作单个值而不是数据集的控件(如QLineEdit、QCheckBox等),没有直接的Model/View对应项来分离数据和视图,因此我们需要一个适配器(Adapters )来将表单连接到数据源。(1)数据和视图分离,低耦合:视图仅负责显示数据,数据逻辑由模型管理,符合MVC(Model-View-Controller)设计思想。下面提供的代码段旨在实现以下功能:将用户在树状视图中选定的每一项,连同其在树状结构中的层级信息(Level),共同展示在应用程序的窗口标题中。
2025-03-14 15:50:03
741
原创 【QT5 Widgets示例】记事本:(四)生成可执行文件
打开以下应用,选择64bit的,与前面选中的构建套件一致。选择Release,然后点击运行。
2025-03-11 21:25:05
180
原创 【QT5 Widgets示例】记事本:(三)功能实现
下面将使用QT的信号槽机制实现界面中各项的功能。要将动作连接到槽,可以右键点击一个动作并选择“转到槽”,然后选择信号。这与保存文件的程序相似,区别是在这里你需要为将要创建的文件输入一个新的文件名。作为文本缓冲区,它存储了当前正在编辑的文件内容。编辑器缓冲区的内容被转换为纯文本,然后写入到。首先需要notepad.cpp需要包含以下头文件。,则会显示错误信息,并且该方法会停止执行。(勾选了“可选的”的动作应选择。存储了我们正在处理的文件名。创建一个 私有的成员变量。下面实现各个槽函数的功能。
2025-03-11 21:20:06
747
原创 【QT5 Widgets示例】记事本:(二)界面设计
其中加粗,斜体和下划线勾选可选的(Checkable)指定文本,对象名称,图标和快捷键(shortcut)点击windowIcon 倒三角,然后点击选择资源。可以点击添加分隔符把同类action放在一块。点击窗口,修改windowTitle项。首先创建一些action(事件)把Text Edit拖拽入界面。至此,action添加完成。修改前缀为图标所在目录。
2025-03-10 21:22:16
445
原创 【数据结构与算法】LeetCode: 动态规划
在二维数组中,dp[i][j] 依赖于 dp[i-1][j] 和 dp[i-1][j-weight[i]],这两个状态都是上一行的数据。如果我们可以确保在更新 dp[i][j] 时,dp[i-1][…dp[j]可以通过dp[j - weight[i]]推导出来,dp[j - weight[i]]表示容量为j - weight[i]的背包所背的最大价值。二维DP:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])
2025-03-09 23:20:35
937
原创 【QT5 Widgets示例】记事本:(一)项目创建
这一系列博客将通过使用C++和Qt Widgets(控件)模块实现一个简单的记事本应用程序。该应用程序的功能包括:新建文件,打开文件,保存文件,另存为,打印;复制,剪切,粘贴;加粗,斜体,下划线,字体;撤回,取消撤回;关于,退出x。
2025-03-09 23:02:16
856
原创 【数据结构与算法】 LeetCode:回溯
左括号 ‘(’ 必须用相同数量的右括号 ‘)’ 闭合。左括号 ‘(’ 必须在对应的右括号 ‘)’ 之前。
2024-11-24 08:50:33
422
2
原创 【数据结构与算法】LeetCode: 贪心算法
从头遍历字符,并更新已遍历字符的最远出现下标,如果找到最远出现位置下标和当前下标相等了,则找到了分割点。到达最后一个下标的最小跳跃次数。统计每一个字符最后出现的位置。能否到达最后一个下标。
2024-10-30 11:10:16
532
原创 【C++网络编程】(五)IO多路复用:poll,epoll
时,如果当前没有任何监控的文件描述符处于就绪状态,进程会被挂起(进入休眠状态)并加入内核的阻塞链表,这是为了避免浪费 CPU 资源。当某个文件描述符的事件发生时,内核会检查阻塞链表,将那些因为等待该事件而阻塞的进程从链表中移除,并将它们唤醒,进程接着可以处理就绪的文件描述符。然而,如果在 ET 模式下未能处理完所有就绪的文件描述符,后续这些文件描述符将不会被再次通知,可能导致数据丢失。,默认值一般为 1024。仅在状态发生变化时返回文件描述符,例如,从不可写变为可写,或从不可读变为可读,或有新数据到来。
2024-10-15 15:06:19
1200
原创 【C++网络编程】(四)IO多路复用:select
此外,CPU在进行线程之间的上下文切换时也会有一定的开销,这进一步增加了系统的负担。在Linux系统中,一切皆文件,每个客户端连接都是以一个文件描述符(File Descriptor,FD)表示。复用指的是允许同一个线程处理多个IO操作,避免了为每个IO操作创建独立线程,从而实现了资源的复用。此外,使用非阻塞套接字避免了阻塞带来的问题,但会导致 CPU 占用高、编程复杂度增加、错误处理变得更复杂,以及可能出现数据传输不完整的情况。调用 select 时,将这个位图传递给内核,以判断哪些文件描述符是就绪的。
2024-10-12 11:50:57
623
原创 【C++网络编程】(二)Linux平台下UDP客户/服务端程序
使用到的函数和宏除了的recvfromsendto和SOCK_DGRAM,其他使用到的函数和宏与TCP网络通信中的基本一致。:用于接收数据报文,适用于无连接的套接字(如 UDP)。它允许从任何源地址接收数据。成功时返回接收到的字节数,失败时返回-1。sockfd:接收数据的套接字描述符。buf:指向接收数据的缓冲区。len:缓冲区的长度,表示最大接收字节数。flags:接收选项的标志,通常为0。src_addr:指向sockaddr结构体的指针,用于存储发送方的地址信息。addrlen:指向。
2024-10-10 15:03:57
688
原创 【C++网络编程】(一)Linux平台下TCP客户/服务端程序
cstdlib>:提供了一些常用的标准库函数,源自 C 的stdlib.h,这些函数与程序控制、内存分配、随机数生成等功能相关。:终止程序执行,status用来返回退出状态码,0表示正常退出,非0表示异常退出。无返回值,直接终止程序。:是对 C 语言string.h的封装,提供了用于操作 C 风格字符串(以'\0'结尾的字符数组)和内存操作的函数。:将指定内存区域的前num个字节设置为value。返回指向ptr的指针,即被修改的内存区域的起始地址。:将格式化数据写入buffer。
2024-10-09 20:55:05
1608
原创 【C++设计模式】行为型模式:中介者模式
中介者模式通过引入一个中介者对象来集中控制对象之间的交互。这样可以解耦多个对象之间的复杂交互关系,使系统更易于维护和扩展。假设我们有一个简单的聊天室应用,其中有每个用户可以发送群聊消息给其他用户,我们可以使用中介者模式来实现用户之间的消息传递。
2024-10-08 14:14:56
489
原创 【C++设计模式】行为型模式:观察者模式
观察者模式定义了一种一对多的依赖关系:它让一个主题(被观察者)对象关联多个观察者对象,并且当主题对象的状态发生变化时,它会主动通知这些观察者对象,使它们能够自动更新自己或执行相应的响应操作。以一个设备的温度显示系统为例,在这个示例中,温度检测仪是被观察者,当设备温度发生变化时,它会通知所有的显示器更新温度信息。
2024-10-08 11:50:49
547
原创 【C++设计模式】结构型模式:桥接模式
在没有使用桥接模式的情况下,每种形状和颜色组合都需要一个独立的类,随着形状和颜色的增加,类的数量会迅速膨胀。通过桥接模式,你只需为形状和颜色分别定义类,这大大减少了需要实现的类的数量。桥接模式的动机是将“高层次的接口或类”与“低层次的接口或类”分离 (…颜色,形状比颜色高一层),使得系统具有更好的灵活性和可扩展性。假设你有一个绘图程序,需要支持绘制多种颜色的多种形状。个颜色结合在一起,会导致类的数量急剧增加(
2024-10-07 14:47:24
728
原创 【C++设计模式】结构型模式:适配器模式
适配器模式的动机确实是解决两个已有接口之间不兼容的问题,通过引入一个适配器类,将不兼容的接口进行转换,使它们能够协同工作,而无需修改已有的代码(通常是旧接口的代码),从而复用旧接口的功能,使其适应新接口的需求。假设我们有一个音频播放系统,需要支持多种音频格式,但旧的播放器只支持MP3格式。假设你有一个日志记录系统,旧的日志记录类只支持输出到控制台,而新的系统希望将日志记录到文件中。是的,你的说法是准确的,并且清晰地表达了适配器模式的核心概念。,它提供了一个不兼容的接口,而现在有一个新的接口。
2024-10-07 11:04:08
759
原创 【数据结构与算法】LeetCode:二叉树
前序遍历(Pre-order Traversal)、中序遍历(In-order Traversal)、后序遍历(Post-order Traversal)和层序遍历(Level-order Traversal)是四种常见的遍历树形结构的方法。首先访问根节点,然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然遵循前序遍历的规则。首先遍历左子树,然后访问根节点,最后遍历右子树。首先遍历左子树,然后遍历右子树,最后访问根节点。在遍历左、右子树时,仍然遵循后序遍历的规则。通常使用递归或栈迭代来实现。
2024-10-03 15:44:46
989
原创 【C++设计模式】(四)创建型模式:简单工厂模式,工厂方法模式,抽象工厂模式
工厂模式的动机在于通过一个专门的工厂类来封装对象的创建过程,以解耦对象的使用和创建,隐藏复杂的对象实例化逻辑,从而提高代码的灵活性和可维护性。抽象工厂模式的主要是为了解决在不需要指定具体类的情况下,创建一组相关或依赖对象 (产品族)的需求。它通过提供一个接口来创建一系列相关或依赖对象的工厂,使得客户端可以在不指定具体实现类的情况下,创建产品族中的产品。工厂方法模式能在不修改已有代码的情况下,通过增加新的工厂类来创建新的产品类型,实现对开闭原则的遵循。来声明创建产品对象的接口,具体的产品创建由具体工厂类(
2024-09-29 14:14:31
711
原创 【数据结构与算法】LeetCode:二分查找
在排序数组中查找元素的第一个和最后一个位置public:// 二分查找变形ans = mid;// 找到目标值时,继续在左半部分查找} else {return ans;// 调用binarySearch函数,查找目标值的第一个位置// 查找目标值的最后一个位置last_pos--;
2024-09-23 00:02:33
479
原创 【数据结构与算法】LeetCode:双指针法
滑动窗口通过双指针实现,一个指针(右指针)用于扩展窗口,另一个指针(左指针)收缩窗口。与普通的双指针不同的是,滑动窗口法的计算过程一般涉及双指针之间的值,而不仅仅是两个指针指向的值。双指针法通常是指使用两个指针相向而行或同向而行来遍历对象(如数组、链表或字符串),以避免多层循环,从而降低算法的时间复杂度。
2024-09-20 22:25:06
1077
原创 【C++设计模式】(三)创建型模式:单例模式
在某些情况下,某些代码组件(如线程池,日志记录器)需要在整个应用程序中共享,使用单例模式可以实现组件资源的复用,并简化系统设计。在懒汉式单例模式中,单例的实例是在首次被需要时才被创建。这种方式的好处在于它可以延迟实例的创建,从而减少程序启动时的资源消耗和初始化时间。在饿汉式单例模式中,单例的实例在程序启动时就立即创建。在多线程环境下,饿汉式是线程安全的,因为实例在类加载时就已经创建好了,不存在并发访问创建实例的问题。懒汉式是指在第一次使用时才会创建单例实例,实例的创建被延迟到第一次使用。
2024-09-01 22:25:19
1042
原创 【C++并发编程】(十三)递归锁
递归锁允许同一线程多次锁定同一个锁,而不会导致死锁。每次加锁操作会增加锁的计数器,但不会阻塞线程;每次解锁操作会减少计数器,当计数器为零时释放锁。与互斥锁一样,递归锁同样可以使用锁管理器,例如。,进行生命周期的自动管理。
2024-07-19 15:43:42
574
原创 【C++并发编程】(十二)自旋锁
在多线程并发的环境中,线程的阻塞和唤醒通常需要涉及操作系统的调度器,进行线程上下文的切换。自旋锁通过忙等待的方式,避免了线程阻塞和系统调度器介入,从而减少了这部分开销。但也需要注意,自旋锁适用于临界区较小且短时间内能够获取锁的情况。如果临界区较大,自旋锁会导致线程长时间占用CPU资源,反而降低系统的整体性能。与传统的互斥锁相同,自旋锁也是一种用于保护共享资源的同步机制,不同都是,自旋锁在尝试获取锁时不会立即进入阻塞状态,而是循环检查锁的状态(自旋),“忙等”直到获取到锁为止。只有两种状态:被设置(
2024-07-17 22:17:09
614
原创 【C++并发编程】(十一)读写锁
读写锁是一种同步机制,它允许多个线程同时以共享模式(读模式)访问共享资源,从而提高了并发读取的效率;然而,在任何一个线程需要独占访问(写模式)以修改共享资源时,它将阻止其他所有线程(无论是读模式还是写模式)访问该资源,以确保数据的一致性和完整性。
2024-07-16 16:37:49
828
原创 【C++并发编程】(十)生产者-消费者模型
生产者-消费者模型是一种经典的并发编程模型,旨在解决多线程环境中负责生成数据或任务的线程(生产者)与负责处理数据或任务的线程(消费者)之间的协作与数据共享问题。:用于存放由生产者生产,被消费者处理的数据或任务。这个缓冲区通常是一个队列。:用于确保生产者和消费者线程之间的有效协调和数据安全共享。
2024-07-08 22:18:12
522
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人