- 博客(25)
- 收藏
- 关注
原创 LibVLC(VLC多媒体库)的核心API
顺序必须正确(先释放 player 和 media,再释放 instance)。可以传入命令行参数(如解码选项、日志级别等)。:设置视频输出窗口(仅限 Windows)。),告诉 VLC 视频画面显示在哪个控件上。:获取播放进度(0.0~1.0 的浮点数)。若播放失败,可通过返回值或事件回调判断。:这一步只是“定义”媒体,尚未播放。:可用于显示总时间或计算进度条比例。:获取当前播放音量(0~100)。:设置播放进度(实现拖动进度条)。:获取播放时长(单位:毫秒)。:设置音量大小(0~100)。
2025-11-06 20:51:38
285
原创 IOCP + 重叠I/O 实例代码
/ 关闭socket。printf("WSASend失败: %d\n", WSAGetLastError());printf("WSARecv失败: %d\n", WSAGetLastError());printf("WSASend失败: %d\n", WSAGetLastError());
2025-11-01 16:15:18
871
原创 【无标题】展示重叠I/O和IOCP如何协同工作
/ 输出 "Hello"- completion_key = handle_data_A // 标识ClientA。completion_key = handle_data_A // 知道是ClientA。- bytes_transferred = 5 // "Hello"的长度。- overlapped = io_data_A // 对应的I/O操作。// 情况1:线程3刚处理完ClientA的上一个请求,立即获得了新的完成包。overlapped = io_data_A // 知道是哪个接收操作。
2025-10-27 18:27:33
529
原创 重叠I/O
重叠I/O,也常被称为异步I/O,是一种输入/输出处理模型。其核心思想是:应用程序发起一个I/O操作(如读取文件、发送网络数据)后,这个操作在后台由操作系统执行,而应用程序的线程可以立即返回,继续处理其他任务,而不是被阻塞在原地等待I/O完成。重叠I/O允许CPU在等待慢速I/O的同时去处理其他计算任务,提高了系统整体的吞吐量。缺点:每个I/O操作都需要一个事件对象,使用 WaitForMultipleObjects 最多只能等待64个对象,管理大量I/O时非常不便。这个函数会阻塞,直到有I/O操作完成。
2025-10-27 13:58:52
382
原创 Qt 的元对象系统
简单来说,元对象系统就是一个关于类的信息的系统。在标准 C++ 中,一个类的信息在编译后几乎就丢失了(这被称为 RTTI 的功能非常有限)。而 Qt 的元对象系统在编译阶段,通过特定的工具,为每个参与该系统的类生成一份额外的“简历”(即元对象),这份简历记录了类的名字、它有哪些信号、哪些槽、有哪些属性、继承关系等。程序在运行时可以查询这份简历,从而获得类的动态信息。核心价值:元对象系统通过在标准 C++ 之上增加一层“反射”能力,极大地增强了 Qt 的动态性和灵活性。QObject和Q_OBJECT是前提。
2025-10-08 00:24:53
734
原创 什么是对象指针和成员函数指针
/ 一个MyClass类型的对象// 一个指向MyClass类型对象的指针return 0;声明一个成员函数指针的语法比较特殊:cpp// 语法:ReturnType (ClassName::*ptrName)(ParameterTypes) = &ClassName::FunctionName;// 声明一个指向MyClass成员函数的指针,该函数接受一个int参数,返回void。
2025-08-31 15:45:19
543
原创 IOCP(I/O Completion Ports,输入输出完成端口) 中的几个核心函数
这个函数允许你手动向完成端口投递一个“人造”的完成通知包。这通常用于优雅地关闭工作线程。cHANDLE CompletionPort, // 目标完成端口DWORD dwNumberOfBytes, // 自定义的字节数ULONG_PTR dwCompletionKey, // 自定义的CompletionKeyLPOVERLAPPED lpOverlapped // 自定义的OVERLAPPED结构指针。
2025-08-30 03:57:31
727
原创 Windows 的 IOCP(I/O Completion Ports,完成端口)
IOCP 是 Windows 平台上最高性能的 I/O 模型。它通过“完成通知”机制,将繁重的 I/O 工作完全交由内核处理,应用程序线程只需专注于业务逻辑,从而实现了在高并发压力下依然能保持低延迟和高吞吐量。虽然其编程模型比select或epoll更复杂,需要精心设计内存管理和上下文结构,但对于追求极致性能的服务器端程序来说,它是无可替代的选择。
2025-08-29 21:55:02
843
原创 什么是线程安全,为什么说C++容器中很多都是线程不安全
核心定义:一个函数、类或对象是线程安全的,当且仅当被多个并发线程同时使用时,其行为仍然是正确的。数据一致性:无论线程如何交替执行,共享数据总能保持逻辑上的正确状态,不会出现损坏、撕裂或逻辑错误。功能正确性:所有操作都能产生预期的结果,不会出现未定义行为、崩溃或无限循环。线程不安全就意味着,当多个线程无同步地访问同一个对象时,其行为是未定义的。它可能正常工作,也可能崩溃、产生错误数据,或者发生任何意想不到的事情。特性C++ STL 容器线程安全容器(如TBB)手动加锁性能最高(零额外开销)
2025-08-29 01:16:59
760
原创 Windows API 中的 CreateIoCompletionPort 函数
简单来说,I/O 完成端口是一种高效的I/O 通知机制。它允许一个应用程序(通常是服务器)同时管理成千上万个并发的异步 I/O 操作(如文件读写、网络通信)。它的工作模式是“生产者-消费者生产者:操作系统内核。当一个异步 I/O 操作(例如WSARecv)完成时,内核会生成一个“完成通知”(包含操作结果等信息),并将其放入完成端口的队列中。消费者:应用程序的工作线程。这些线程等待在完成端口上,一旦队列中有通知,某个线程就会被唤醒,取出通知并进行后续处理(如处理接收到的数据)。高性能和可扩展性。
2025-08-28 12:33:45
748
原创 WaitForSingleObject 函数
未通知”和“已通知”。未通知状态:表示该对象所代表的事件尚未发生。已通知状态:表示该对象所代表的事件已经发生。的功能就是阻塞当前线程,直到指定的对象从“未通知”变为“已通知”。线程 (Thread)HANDLE): 线程结束时变为已通知状态。进程 (Process)HANDLE): 进程结束时变为已通知状态。事件 (Event)HANDLE): 核心的同步对象,由程序手动或自动设置其状态。互斥体 (Mutex)HANDLE): 当它不被任何线程占有时变为已通知状态。信号量 (Semaphore)
2025-08-28 12:32:28
810
原创 大端字节,小端字节,主机位转网络位,大端传输,小端存储。
在进行网络通信时,需要将主机字节序转换为网络字节序(通常是大端字节序)。最低有效字节(Least Significant Byte, LSB)**存储在最高的内存地址。网络字节序是指在网络通信中使用的标准字节序。大端字节序指的是**最高有效字节(Most Significant Byte, MSB)主机字节序是指计算机硬件的字节序,不同的处理器架构可能采用不同的字节序。因此,在进行网络编程时,通常需要将主机字节序转换为网络字节序,反之亦然。小端字节序指的是**最低有效字节(LSB)假设有一个32位的整数。
2025-04-05 22:50:18
348
原创 客户端和服务端的概念
客户端和服务端的交互是现代网络应用的基础,它们之间的通信协议和数据格式通常是标准化的,以确保不同系统之间的互操作性。客户端和服务端的设计和实现需要考虑到性能、安全性、可扩展性等多个方面,以提供稳定可靠的服务。
2024-12-21 22:49:57
1149
原创 C++ 虚函数(Virtual Function)
虚函数是 C++ 中实现**运行时多态(动态多态)**的核心机制。通过虚函数,程序可以在运行时根据对象的实际类型来决定调用哪个函数,而不是在编译时确定。这使得基类的指针或引用可以指向派生类的对象,并调用派生类重写的函数。当通过基类的指针或引用调用虚函数时,程序会根据实际对象的类型来决定调用哪个实现。C++ 通过**虚函数表(vtable)和虚指针(vptr)**来实现虚函数。每个包含虚函数的类都有一个虚函数表,存储着虚函数的地址。虚函数主要用于实现多态性,允许程序在运行时根据对象的实际类型调用相应的函数。
2024-11-21 22:11:21
468
原创 C++内存泄漏C++
*内存泄漏**是指程序在运行过程中分配了内存,但在不再需要时没有释放这些内存,导致内存无法被重新利用。C++11 引入了智能指针(如 `std::unique_ptr` 和 `std::shared_ptr`),它们可以自动管理内存,避免手动释放内存。在C++中,使用 `new` 分配内存后,必须使用 `delete` 释放内存。在复杂的程序中,动态分配的内存可能在多个地方被使用,如果忘记在某个路径中释放内存,就会导致内存泄漏。- **内存泄漏**是指程序分配了内存但没有释放,导致内存无法被重新利用。
2024-11-13 21:30:46
796
原创 ODR
1. **每个变量或函数只能有一个定义**:在C++中,每个变量或函数在整个程序中只能有一个定义。6. **类的定义**:类的定义包括类的成员变量和成员函数的声明和定义。4. **外部链接**:使用`extern`关键字声明的变量或函数表示它们具有外部链接,意味着它们可以在其他文件中定义和使用。5. **内部链接**:使用`static`关键字声明的变量或函数表示它们具有内部链接,意味着它们只能在声明它们的文件中使用。7. **模板的定义**:模板的定义通常放在头文件中,因为模板在实例化时需要完整的定义。
2024-11-01 23:24:51
363
原创 函数的本质
函数可以接受参数,这些参数是传递给函数的数据,使得函数能够根据不同的输入执行不同的操作。参数可以是值传递(传递的是值的副本),也可以是引用传递(传递的是原始数据的引用),这取决于函数的设计需求。在C++中,函数的本质是程序中的一个可重用代码块,它执行特定的任务,并且可以接受输入(参数),并返回输出(返回值)。这为函数提供了更大的灵活性,使得同一个函数名可以根据不同的参数执行不同的操作。内联函数是C++中的一种优化机制,它建议编译器将函数的代码直接插入到调用它的地方,从而减少函数调用的开销。
2024-10-31 11:06:44
623
原创 内存存储顺序
在内存中,整数的存储顺序取决于计算机的字节序(endianness)。在大端序中,`12`(最高有效字节)会存储在最低的内存地址上,然后是`34`,`56`,`78`。在小端序中,`78`(最低有效字节)会存储在最低的内存地址上,然后是`56`,`34`,`12`。2. **小端序(Little-endian)**:最低有效字节(LSB)存储在最低的内存地址上,即从右到左存储。对于整数 `0x12345678`,我们可以将其分解为四个字节:`12`, `34`, `56`, `78`。
2024-10-22 22:27:02
288
原创 conio
conio.h` 是一个在C语言中用于控制台输入输出的头文件,它主要在一些旧的编译器中使用,比如Turbo C/C++和一些DOS时代的编译器。由于 `conio.h` 是特定于某些旧系统的,现代的编程环境(如GCC、Clang、MSVC等)并不支持它,或者其功能可能被其他库(如Windows API、ncurses等)替代。例如,在Windows平台上,可以使用 `GetAsyncKeyState` 函数来检测按键状态,而在跨平台的C++程序中,可以使用 `ncurses` 库来处理控制台输入输出。
2024-10-18 00:25:04
310
原创 va_list(),va_start(),va_arg(),va_end() 详细解析
va_list`, `va_start`, `va_arg`, 和 `va_end` 是C语言中用于处理可变参数列表的宏。在这个例子中,`sum`函数接受一个整数`count`表示参数的数量,然后是`count`个整数。每次调用`va_arg`都会返回下一个参数,并更新`va_list`变量以指向下一个参数。`va_start` 宏初始化`va_list`类型的变量,以便遍历可变参数列表。- `va_end`之前必须调用`va_start`,且`va_end`之后不能再使用`va_arg`。
2024-10-16 16:13:20
766
空空如也
c++,main处理命令行选项
2024-05-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅