一个人的战争(3) : 我眼中的异步与非阻塞

getBoundingClientRect原理与实战:浏览器渲染快照的正确用法 getBoundingClientRect是Web前端中获取元素几何位置的核心API,其本质并非简单的尺寸读取,而是对浏览器渲染管线完成Layout和Paint后生成的视口坐标系快照。它绕过CSS计算逻辑,直接返回用户实际看到的像素级边界,因此在处理transform、scale、RTL等复杂样式时具备天然优势。该API返回浮点型CSS像素值,需注意设备像素比与四舍五入处理;其坐标系基于viewport而非文档流,与offsetTop/offsetLeft存在根本性差异。在拖拽吸附、富文本光标定位、虚拟滚动 阅读详情

         最近在尝试封装个网络工具包,从Socket开始,希望全部自己动手并且能提供一个跨平台的接口,哈哈,新手的通病就是求大求全,不过有一点,就是学习一些现代操作系统共有的特性的时候,我认为站在多个差不多的平台的角度来看待同一个问题要比单一的观察一个OS提供的API要好的多.

        闲话少说, 当我进行到WIN32的OVERLAPPED I/O和IOCP的时候突然发现我无法继续抽象了,众所周知,Berkeley socket并没有提供一个异步操作的网络I/O函数,也就是无法提供一个相同的界面,这时候我反问自己,到底什么是异步呢?返回头看我封装的一部分

 

 

class IOCP : private NonCopyable
{
private:
        HANDLE                    m_handle;
        size_t                    m_max_worker_thread;
        size_t                    m_curr_worker_thread;
        
bool                    m_is_running;
        std::vector
<ThreadSpace::ThreadX*>    m_thread_hdl;
public:
        IOCP(size_t max_worker_thread 
= 2);
        
virtual ~IOCP();
        
bool create();//size_t worker_thread_num);
        void close();
        
int increase_worker_thread(size_t n);            //增加N个workerthread;
        int decrease_worker_thread(size_t n);            //减少n个workerthread;
public:
        
bool associate_handle_with_iocp(HANDLE hdl, void* key);
        
bool post_a_status(t_u_long num, void *key, void *async_info);
public:
        t_u_int32 worker_thread(
void *arg);
public:
        
virtual bool error_handle(t_u_long num, void *key, void *pdata);// = 0;
        virtual void real_worker(t_u_long num, void *key, void *pdata) = 0;
}
;

 

 


IOCP::IOCP(size_t max_worker_thread) :
                       m_handle(INVALID_HANDLE_VALUE),
                       m_max_worker_thread(max_worker_thread),
                       m_curr_worker_thread(
0),
                       m_is_running(
false)
{


}



IOCP::
~IOCP() 
{ 
        
try{
                close(); 
        }
catch(...)
        
{

        }

}



bool IOCP::associate_handle_with_iocp(HANDLE hdl, void *key)
{
        
if(!m_is_running) return false;
        
return (::CreateIoCompletionPort(hdl, m_handle, (ULONG_PTR)key, 0) != NULL);
}



bool IOCP::post_a_status(t_u_long num, void *key, void *async_info)
{
        
if(!m_is_running) return false;
        
return (::PostQueuedCompletionStatus(m_handle, num, (ULONG_PTR)key, (OVERLAPPED*)async_info) == TRUE);
}


int IOCP::increase_worker_thread(size_t n)
{
        
if(!m_is_running) return -1;
        
        
using namespace ThreadSpace;
        
        ThreadAttr attr;
        attr.create_flags 
= 0;
        attr.stack_size 
= 0;
        
        size_t i;
        
for( i = 0; i < n; ++i){
                
if(m_curr_worker_thread == m_max_worker_thread) break;
                
void *p = 0;
                ThreadX
* pthread = MFExecutor(this, &IOCP::worker_thread, p, attr);
                m_thread_hdl.push_back(pthread);
                
++m_curr_worker_thread;
        }

        
return i;
}


                
int IOCP::decrease_worker_thread(size_t n)
{
        
if(!m_is_running) return -1;
        size_t i;
        
for( i = 0; i < n; ++i){
                
if(m_curr_worker_thread == 0) break;
                post_a_status(OP_SHUT_DOWN, (
void*)OP_SHUT_DOWN, (void*)OP_SHUT_DOWN);
                
                
--m_curr_worker_thread;
        }


        
        
for(size_t j = 0; j < i; ++j){ //将所有结束的线程句病剔除掉
                t_u_long idx = wait_multi_thread(&m_thread_hdl[0], m_thread_hdl.size(), false);
                free_thread(m_thread_hdl[idx 
- WAIT_OBJECT_0]);
                m_thread_hdl.erase(m_thread_hdl.begin() 
+ idx - WAIT_OBJECT_0);
        }


        
return i;
}




bool IOCP::create()
{
        
if(m_is_running) return false;
        
        m_handle 
= ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
        assert_ex((m_handle 
!= NULL), IOModelExpt(::GetLastError()));
        
        m_is_running 
= true;
        increase_worker_thread(m_max_worker_thread);
        
return true;
}


void IOCP::close()
{
        
if(!m_is_running) return;

        
if(m_curr_worker_thread != 0){
                decrease_worker_thread(m_curr_worker_thread);
        }

        CloseHandle(m_handle);
        m_is_running 
= false;
}



t_u_int32 IOCP::worker_thread(
void *arg)
{
        
while(true){
                t_u_long num 
= 0;
                
void    *pdata;
                
void    *pkey = 0;
                
                
bool state = (GetQueuedCompletionStatus(m_handle, 
                                                    
&num, 
                                                    (DWORD
*)&pkey, 
                                                    (LPOVERLAPPED
*)&pdata, 
                                                    INFINITE
                                                    ) 
== TRUE);
                                                    
                
if(!state)
                
{
                        
if(error_handle(num, pkey, pdata))
                        
{
                                
continue;
                        }
else
                        
{
                                
break;
                        }

                }
else 
                
{
                        
if( num == OP_SHUT_DOWN && (t_u_long)pkey == OP_SHUT_DOWN && (t_u_long)pdata == OP_SHUT_DOWN)
                                
break;
                        
                        real_worker(num, pkey, pdata);
                }

        }

        
return 0;

}


bool IOCP::error_handle(t_u_long num, void *key, void *pdata)
{
        t_u_long err_code 
= ::GetLastError();
        
if(err_code == WAIT_TIMEOUT)
        
{
                
return true;
        }
else 
        
{
                
return false;
        }

        
}


}

 

请注意

 

u_int32 IOCP::worker_thread(void *arg)

 

这个函数是启动后当做N个线程来运行的,

 

 bool state = (GetQueuedCompletionStatus(m_handle, 
                                                    
&num, 
                                                    (DWORD
*)&pkey, 
                                                    (LPOVERLAPPED
*)&pdata, 
                                                    INFINITE
                                                    ) 
== TRUE);

 

函数执行到这里是等待有无I/O操作,这时候我发现,所谓的“异步”这个词汇的语义是“协作”,这个“协作”的语义无所谓线程或者进程等等,这时候那个所谓的异步IO函数类似WSARecv等,的语义已经不是接受数据了,而应该是发起一个接受数据的信号,告诉正在等待执行实际IO操作的地方执行动作,所谓的IOCP的handle, key和overlapped结构等都应该被归为同步点信息,如果这样理解的话,我用select和非阻塞recv照样能封装出和IOCP相同界面的类,所以我定义了一个

 


class AsyncInfo
{
public:
        ::WSAOVERLAPPED            overlapped;
        
char                    buf[MAXIMUMPACKAGESIZE];
        size_t                    len;
public:
        AsyncInfo();
        
~AsyncInfo();
        
void clear();
}
;

 

        这个结构当然是win32下的,给WSARecv等函数调用,说白了就是发送一个同步点信息,我并没有确切的用select或者linux下的epoll实做一个和iocp相同接口的类,但是我认为经过繁杂的处理后还是可以完成的。

 

        下面说下我认为的非阻塞与异步的区别,这也是让我头疼了很久的东西

        如上所述,所谓异步,就是协作,异步函数的语义已经退化为向某个地方发起一个执行指令了。而阻塞与非阻塞是针对一个函数说的,所谓阻塞的意义是当这个函数未完成则无法继续向下执行,而非阻塞是一种试探性的语义,类似非阻塞的send就是可以写么?如果可以则写入,否则返回错误,这和异步完全是两个东西,但是总容易让人搞混,以上是一点心得,请高人指定.

 

 

程序员职业成长手记:从.NET实践看技术人的三层修炼 程序员成长的本质,不是技术栈的堆叠,而是思维范式与工程心智的持续进化。在.NET这一兼具历史纵深与现代演进的典型技术生态中,开发者得以系统性地经历‘做人→做技术人员→做程序员’的三层递进:从协作边界与认知共情,到技术选型背后的组织适配与风险权衡,再到语法特性在真实Code Review与生产环境中的落地校验。这种以问题为起点、以源码为依据、以人因变量为标尺的反思路径,超越了框架教程与API文档,直指软件工程的核心矛盾——如何让代码既正确,又可持续、可协作、可传承。本文即基于十年持续更新的.NET技术博客实践 阅读详情

相关推荐

时间序列可视化:从绘图到时间理解协议的工程实践

时间序列可视化远不止于折线图绘制,其本质是面向时序数据的语义建模与决策支持技术。它需解决时间戳解析、多源对齐、重采样语义、噪声鲁棒性等核心问题,涉及UTC归一化、STL趋势分解、格兰杰因果钻取等关键技术。在工业监控、IoT运维、医疗监护等场景中,可视化必须内嵌领域知识(如ECG波形标注、振动频谱映射),并支撑毫秒级精度、亚秒级交互与预测不确定性表达。本文聚焦真实生产环境中的时间理解协议设计,涵盖Rust预处理、WebAssembly加速DTW、语义锚定钻取等硬核实践。

380

杜塞尔多夫SREcon:面向真实故障的SRE工程实践

SRE(站点可靠性工程)本质是将软件工程方法应用于系统可靠性保障,其核心在于SLO、错误预算、自动化与故障驱动学习。在云原生与分布式系统复杂度持续攀升的背景下,SRE已从理论框架演进为需深度结合生产环境约束的落地能力——尤其体现在跨时区协作、混沌工程验证、可观测性数据闭环等关键环节。真实故障复盘、Prometheus+Loki+Jaeger可观测链路协同分析、eBPF级根因定位等技术实践,正成为SRE工程师应对Kubernetes碎片化、时区延迟模型、GDPR合规等现实挑战的核心武器。本文基于SREcon

weixin_34128839的博客 417

More Exceptional C++ 读书笔记

More Exceptional C++ 读书笔记 Item 1 Switching Streams (1): 多考虑易读性,避免编写过渡简洁但是不易懂,不易维护的代码;    记个相当简洁的流切换代码:  (argc > 2 ? ofstream(argv[2], ios::out|ios::binary) : cout ) 1 ? ifstream(argv[1],      ios

Solidus的专栏 1044

生产级机器学习系统:从模型部署到可靠决策的工程实践

机器学习模型上线后效果衰减、延迟飙升、决策不可信——这并非算法缺陷,而是系统可靠性缺失的典型表现。本文围绕ML系统在真实业务场景中的稳定性、可观测性与可治理性展开,深入解析数据契约、特征漂移监控、多级熔断降级、全链路追踪等核心机制。聚焦‘模型服务化’这一高频搜索技术点,结合金融风控等强合规场景需求,系统阐述如何构建具备故障自愈能力、决策可回溯、性能可压测的生产就绪ML服务。内容覆盖从接口Schema校验、OpenTelemetry埋点实践,到BentoML+FastAPI工程落地,为算法工程师、MLOps平

weixin_33744141的博客 331

【信息科学与工程学】计算机科学与自动化——第六十三篇 人机交互之前端交互参数知识库02

每个分支下又细分了四个关键方向,并按照“研究对象/焦点、基本问题、核心理论/概念、研究方法、应用/目标、前沿/发展”的框架进行阐述,严格遵循了六级编码体系。在最终整合时,应建立唯一的学科分类编码表(例如,用两位数字或“ART”、“MED”、“ECO”等字母前缀),并确保所有下级编码(尺度、层次、类别、子类、具体项)的逻辑一致性。此回答中的编码为示例,实际系统需据此调整。控制过程(前馈、同期、反馈)、全面质量管理(TQM)、平衡计分卡(BSC)定量(调查、实验)、定性(访谈、民族志)、混合方法、大数据。

weixin_49199313的博客 674

2026年AI大模型面试题整理(含答案).zip

2026年AI大模型面试题整理(含答案),共76份。供大家学习参阅。 AI大模型八股文(102).pdf Transformer面试题总结97道.pdf 大模型 LLM 最全八股和答案.pdf 大模型 RAG 经验面.pdf 大模型LLMS面试宝典.pdf 大模型岗位面试全纪录.pdf 大模型常考面试题总结+答案.pdf 大模型常见面试题及解答1.pdf 大模型常见面试题及解答2.pdf 大模型常见面试题及解答3.pdf 大模型校招面试题.pdf 50个精通AI大模型面试题.pdf 52道大模型八股文面试题\1-大模型(LLMs)基础面.docx 52道大模型八股文面试题\10-LLMs+训练经验帖.docx 52道大模型八股文面试题\11-大模型(LLMs)langchain+面.docx 52道大模型八股文面试题\12-多轮对话中让AI保持长期记忆的8种优化方式篇.docx 52道大模型八股文面试题\13-基于langchain+RAG问答应用实战.docx 52道大模型八股文面试题\14-基于LLM+向量库的文档对话+经验面.docx 52道大模型八股文面试题\15-大模型+RAG+经验面.docx 52道大模型八股文面试题\16-LLM文档对话+——+pdf解析关键问题.docx 52道大模型八股文面试题\17-大模型(LLMs)RAG+版面分析——表格识别方法篇.docx 52道大模型八股文面试题\18-大模型(LLMs)RAG+版面分析——文本分块面.docx 52道大模型八股文面试题\19-大模型外挂知识库优化——如何利用大模型辅助召回?.docx 52道大模型八股文面试题\2-Layer+normalization+篇.docx 52道大模型八股文面试题\20-大模型外挂知识库优化——负样本样本挖掘篇.docx 52道大模型八股文面试题\21-RAG(Retrieval-Augmented+Generation)评测面.docx 52道大模型八股文面试题\22-检索增强生成(RAG)+优化策略篇6.docx 52道大模型八股文面试题\23-大模型(LLMs)RAG+——+关键痛点及对应解决方案.docx 52道大模型八股文面试题\24-大模型(LLMs)RAG+优化策略+——+RAG-Fusion篇.docx 52道大模型八股文面试题\25-Graph+RAG+面+—+一种+基于知识图谱的大模型检索增强实现策略.docx 52道大模型八股文面试题\26-大模型(LLMs)参数高效微调(PEFT)+面.docx 52道大模型八股文面试题\27-适配器微调(Adapter-tuning)篇.docx 52道大模型八股文面试题\28-提示学习(Prompting)篇.docx 52道大模型八股文面试题\29-LoRA+系列篇.docx 52道大模型八股文面试题\3-LLMs+激活函数篇.docx 52道大模型八股文面试题\30-如何使用+PEFT库+中+LoRA?.docx 52道大模型八股文面试题\31-大模型(LLMs)推理面.docx 52道大模型八股文面试题\32-大模型(LLMs)增量预训练篇.docx 52道大模型八股文面试题\33-增量预训练(Pretrain)样本拼接篇.docx 52道大模型八股文面试题\34-基于lora的llama2二次预训练.docx 52道大模型八股文面试题\35-大模型(LLMs)评测面.docx 52道大模型八股文面试题\36-大模型(LLMs)强化学习面.docx 52道大模型八股文面试题\37-大模型(LLMs)强化学习——RLHF及其变种面.docx 52道大模型八股文面试题\38-大模型(LLMs)强化学习——+PPO+面.docx 52道大模型八股文面试题\39-强化学习在自然语言处理下的应用篇.docx 52道大模型八股文面试题\4-Attention+升级面.docx 52道大模型八股文面试题\40-大模型(LLMs)训练集面.docx 52道大模型八股文面试题\41-大模型(LLMs)LLM生成SFT数据方法面.docx 52道大模型八股文面试题\42-大模型(LLMs)显存问题面.docx 52道大模型八股文面试题\43-显存优化策略篇.docx 52道大模型八股文面试题\44-大模型(LLMs)分布式训练面.docx 52道大模型八股文面试题\45-图解分布式训练(一)+——+流水线并行(Pipeline+Parallelism).docx 52道大模型八股文面试题\46-图解分布式训练(二)+——+nn.DataParallel篇.docx 52道大模型八股文面试题\47-图解分布式训练(三)+——+nn.parallel.DistributedDataParallel.docx 52道大模型八股文面试题\48-图解分布式训练(四)+——+torch.multiprocessing+详细解析0.docx 52道大模型八股文面试题\49-图解分布式训练(五)+——+AMP混合精度训练+详细解析.docx 52道大模型八股文面试题\5-transformers+操作篇.docx 52道大模型八股文面试题\50-图解分布式训练(六)——+Pytorch的+DeepSpeed+详细解析.docx 52道大模型八股文面试题\51-图解分布式训练(七)——+accelerate+分布式训练+详细解析.docx 52道大模型八股文面试题\52-图解分布式训练(八)——+ZeRO+学习.docx 52道大模型八股文面试题\6-LLMs+损失函数篇.docx 52道大模型八股文面试题\7-相似度函数篇.docx 52道大模型八股文面试题\8-大模型(LLMs)进阶面.docx 52道大模型八股文面试题\9-大模型(LLMs)微调面.docx 李老师AI大模型面试题资料\Agent Loop&Loop Engineering面试10连问.md 李老师AI大模型面试题资料\Agent Loop面试10连问.pptx 李老师AI大模型面试题资料\AI大模型面试题.png 李老师AI大模型面试题资料\DeepSeek Harness 10连问.pptx 李老师AI大模型面试题资料\FDE岗位常见面试题.pptx 李老师AI大模型面试题资料\Milvus3.0新特性.pptx 李老师AI大模型面试题资料\RAG码士学习平台知识库项目.png 李老师AI大模型面试题资料\RAG码士学习平台知识库项目.pptx 连老师AI大模型面试资料\Langchain.txt 连老师AI大模型面试资料\连老师LangChain面试题:httpscloud.fynote.comsharesZUIogPG4.txt

一个人的战争 (1) : Bencoding格式解码

        自学C++一年有余,一直想自己开发个什么东西,终于在今年7月份决定写个BT的客户端吧,恩,说干就干,于是开始了这次痛苦的旅程,越深入到各个细节当中越觉得自己可能完不成这个东西了,故决定开始写Blog激励自己一下,也希望能把一个编程新手遇到的各种困难都记录下来,供他人借鉴,也便于自己日后的查寻. 我这人比较罗嗦,可能整个文档中间会夹杂一些个人感悟,期望哪位不幸读到的朋友谅解. 有对P

Solidus的专栏 1396

政府科技管理者如何保障科技成果评价的公正透明?.docx

政府科技管理者如何保障科技成果评价的公正透明?

泛化的ScopeGuard模板类

 #pragma once#include cassert>#include memory>#include "non_copy_able.h"class ScopeGuardImp : private NonCopyable...{public:        ScopeGuardImp() ...{ };        virtual ~ScopeGuardImp()...{ }};t

Solidus的专栏 1385

【Web服务器运维】基于Nginx与Keepalived的高可用负载均衡系统部署:实现故障自动切换与虚拟IP管理

内容概要:本文详细介绍了如何通过Nginx与Keepalived实现高可用的负载均衡架构。首先讲解了Nginx的安装部署流程,包括依赖环境的准备、源码解压编译、启动及配置重载;接着介绍了Keepalived的安装步骤及其服务管理方式;重点在于通过配置Keepalived的主备节点(MASTER/BACKUP),结合VRRP协议和虚拟IP(VIP)实现故障自动切换,并通过自定义脚本nginx_check.sh实时检测Nginx运行状态,确保服务高可用;最后补充了在云环境中因组播限制导致心跳不稳定时,应改用单播(unicast)方式进行通信的解决方案。; 适合人群:具备Linux系统操作基础、熟悉网络基础知识,从事运维、DevOps或Web服务部署的技术人员,尤其是工作1-3年的工程师。; 使用场景及目标:①搭建高可用的Web负载均衡系统,避免单点故障;②掌握Nginx与Keepalived协同工作的原理与实战配置方法;③应用于生产环境中提升服务稳定性与容灾能力。; 阅读建议:学习时应结合实验环境动手操作,重点关注keepalived.conf配置差异与nginx_check.sh脚本逻辑,理解VRRP机制及单播替代组播的实际应用场景,注意根据实际网络环境调整IP与网卡参数。

三电平Buck直流变换器双闭环、单闭环、开环仿真【附参考文献】(Simulink仿真实现)

内容概要:本文档系统介绍了三电平Buck直流变换器在Simulink环境下的开环、单闭环与双闭环控制系统的建模仿真方法,涵盖系统建模、控制策略设计及动态性能对比分析。通过构建不同控制结构,深入探讨电压调节精度、系统响应速度、抗干扰能力及稳定性差异,重点剖析双闭环控制中电压外环与电流内环的协同作用机制,揭示其在抑制输出纹波、提升负载适应性方面的优势,帮助读者掌握多电平DC-DC变换器的核心控制原理与工程实现技术;文档还提供了详实的仿真参数设置与参考文献,便于理论验证与实践复现。; 适合人群:电力电子、自动化、电气工程及其相关专业的高校本科生、研究生、科研人员,以及从事电源系统、新能源变换器开发的工程技术人员。; 使用场景及目标:①作为高校电力电子课程的教学案例,辅助学生理解Buck变换器多层次控制策略的设计思路与性能差异;②为科研项目中高效直流变换系统的仿真研究提供可复用的技术模板;③指导工业界在高精度电源设计中优化控制器参数,提升系统动态响应与稳定性。; 阅读建议:建议结合Simulink仿真模型同步操作,对照文档逐步搭建各控制结构,重点观察不同闭环配置下输出电压的瞬态与稳态表现,深入理解PI参数整定、环路耦合影响及系统频域特性的关联性,从而全面提升对电力电子系统控制设计的综合把握能力。

一个人的战争(2) : 成员函数与线程

         本来今天打算贴BT Client的Tracker Requester的代码的,可是整理的不太完善,因为里面牵扯到很多线程和IOCP的东西,所以我先把一部分自己封装的线程代码贴上来供各位读者评论       先看下我对Win32线程的最浅封装,       注意这个是声明在thrad/win32/data_type.h下的struct ThreadHandle   

Solidus的专栏 1186

国央企创新负责人如何实现科技成果的全流程数字化管理?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Exceptional C++ 读书笔记

Exceptional C++ 读书笔记 //内存管理的一部分来自于http://blog.youkuaiyun.com/kingofark/category/9109.aspx Item 1 Iterator:     (1): 注意当前迭代器是否有效,如果无效则解引用产生程序错误; (2):注意当前迭代器生命期,某些容器经过某些操作后将重新分配内部存储空间,则当前迭代器无效; (3) : 有效范围

Solidus的专栏 1101

高校技术转移办公室人员在推介成果转化时,如何实现技术成果的精准呈现?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

单相PWM整流器基于直流电流控制+虚拟dq两种闭环控制仿真【2个仿真+参考资料】

内容概要:本文系统介绍了单相PWM整流器的两种主流闭环控制策略——基于直流电流控制和虚拟dq坐标系控制,配套提供了两个完整的Simulink仿真模型及相关参考资料。资源聚焦于控制系统的设计原理与实现细节,深入剖析电压外环与电流内环构成的双闭环结构,旨在实现高功率因数运行、直流侧电压稳定以及优异的动态响应性能。通过对两种控制方法的建模、仿真与对比分析,帮助使用者全面理解其在控制精度、抗扰动能力、系统稳定性及工程实用性等方面的差异与适用场景。; 适合人群:电气工程、自动化、电力电子与电力传动等相关专业的本科生、研究生,以及从事新能源发电、电力变换系统、电能质量治理等领域研发工作的工程技术人员。; 使用场景及目标:①学习和掌握单相PWM整流器的基本工作原理、数学建模与主电路设计方法;②深入理解直流电流控制与虚拟dq控制的核心思想、实现流程及其在实际系统中的优缺点与应用场景差异;③为毕业设计、课程设计、科研课题或工业级产品开发提供可靠的仿真平台和技术参考依据。; 阅读建议:建议结合Simulink仿真模型与参考资料进行同步学习,动手调整控制器参数并观察系统动态响应变化,以深化对控制策略的理解;在掌握单相系统基础上,可进一步拓展学习三相PWM整流器、图腾柱PFC、Vienna整流器等先进拓扑及其控制技术,逐步构建完整的电力电子变换器控制知识体系。

C语言结构的成员对齐

Natural Alignment == sizeof(type);   Order  Alignment ==  k == 所指定的Alignment; 例如#pragma pack(8) k == 8;   Actual Alignment == min(Natural Alignment, k);   struct Actual Alignment == max(each member);

Solidus的专栏 646

dify案例-基于Dify打造智能合同审查助手:零代码搭建工作流全指南

Dify的工作流(Workflow)功能是一个可视化流程编排工具,允许用户通过拖拽节点的方式构建复杂的AI应用。与简单的问答应用不同,工作流支持多步骤任务处理、条件分支、并行执行等高级功能,非常适合合同审查这类结构化任务。可视化编排:无需编写代码,通过拖拽连接节点即可构建复杂流程多模型协作:可在不同节点使用最适合的AI模型灵活集成:支持知识库检索、条件判断、API调用等多种节点类型迭代优化:可随时测试和调整单个节点,不影响整体流程可视化搭建:无需编码经验,拖拽式构建复杂审查流程灵活扩展。

weixin_44245188的博客 1939
上一篇: 一个人的战争(2) : 成员函数与线程
下一篇: 泛化的ScopeGuard模板类
SolidusSnake
博客等级 码龄20年 1粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值