当前位置: 首页 > article >正文

Java 上位机防空警报系统开发

通讯结构中央站 -区域站-终端支持全控 选控 单控。可诊断每个设备回示记录通讯协议使用modbus相关核心代码通讯线程池package com.common.buscomm.taskRun.base.runable; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil; import com.common.base.util.logCall.UtilLogOpenConfi; import com.common.base.util.logCall.UtilRunTrace; import com.common.buscomm.taskRun.base.enums.EnumQueueType; import com.common.buscomm.taskRun.base.enums.EnumTaskStep; import com.common.buscomm.taskRun.base.enums.EnumTransMethod; import com.common.buscomm.taskRun.base.logs.LogsTask; import com.common.buscomm.taskRun.base.statiCahce.CacheTaskConfi; import com.common.buscomm.taskRun.base.statiCahce.StatiCacheTask; import com.common.buscomm.taskRun.base.vo.VoRConfig; import com.common.buscomm.taskRun.base.vo.VoRTask; import com.common.buscomm.taskRun.base.vo.VoRTaskReturnStatus; import com.common.buscomm.taskRun.base.vo.VoRTaskSend; import com.common.buscomm.taskRun.taskRunLimitOne.TaskRunOneLimit; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 线程父类 * author chenyuanlong * date 2023/10/12 18:12 */ Data Slf4j public abstract class RunableRTaskParent implements Runnable { /** * 任务优先级 优先级队列的时候使用 线程池compare中使用 */ private BigDecimal taskPriority; public BigDecimal getTaskPriority() { if(taskPrioritynull){ taskPrioritythis.getCurTask().getTaskPriority(); } return taskPriority; } /** * 运行配置 */ private VoRConfig voRConfig; /** * 当前任务信息运行总id */ private String runId; /** * 当前任务编号 用于读取当前任务 */ private String taskBusn; /** * runDo 完成后的时间 用于判断监听回示的超时时间 */ private Date doFinishTime; public VoRTask getCurTask(){ VoRTask voRTask StatiCacheTask.getTaskOne(this.getRunId(),this.getTaskBusn()); return voRTask; } public void runIni(String runId,String taskBusn,VoRConfig voRConfig){ this.runIdrunId; this.taskBusntaskBusn; this.voRConfigvoRConfig; } Override public void run() { runFlow(); runEnd(); } /** * 任务流 每次启动或者重新运行任务 */ public void runFlow(){ //开始运行数据处理, 当前队列缓存改成开始运行 runBegin(); //运行等待: 数据处理, 当前队列缓存改成等待运行 runAccept(); //运行的具体内容 runDo(); this.doFinishTimenew Date(); //运行结果监听: 包含超时处理,固定1秒监听一次 runListener(); return; } /** * 运行的具体内容 运行子类覆盖 */ public abstract void runDo(); /** * 运行完毕后数据处理 运行子类覆盖 部分线程放空直接在 runParseReturnDeal 实现 */ public abstract void runEndDealSave(VoRTask voRTask); /** * 任务解析返回结果解析完后重新设置状态 【成功 失败 继续运行】 * param voRTask */ public abstract void runParseReturnDeal(VoRTask voRTask); /** * 开始运行数据处理, 当前队列缓存改成开始运行 */ public void runBegin(){ VoRTask voRTaskgetCurTask(); voRTask.taskRunTimesAddOne(); if(StrUtil.isEmpty(voRTask.getTaskBegTime())){ voRTask.setTaskBegTime(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_FORMAT)); } voRTask.setTaskThisRunTime(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_FORMAT)); voRTask.setTaskStep(EnumTaskStep.runBegin); StatiCacheTask.runAllTaskLogInfoAll(this.runId); } /** * 运行等待: 数据处理, 当前队列缓存改成等待运行 */ public void runAccept(){ getCurTask().setTaskStep(EnumTaskStep.runAccept); } /** * 运行失败 * param log */ public void runFail(String log){ VoRTask voRTaskCur getCurTask(); voRTaskCur.setTaskStep(EnumTaskStep.runReturnFail); voRTaskCur.addTaskLog(log); } /** * 设置超时状态 */ public void runEndTimeOut(String log){ getCurTask().addTaskLog(log); this.getCurTask().setTaskStep(EnumTaskStep.runErrorTimeOut); this.runEndDealSave(this.getCurTask()); } /** * 运行继续进行 * param successMsg */ public void runReturnContinue(String successMsg){ getCurTask().setTaskStep(EnumTaskStep.runReturnContinue); VoRTaskReturnStatus voRTaskReturnStatus new VoRTaskReturnStatus(); voRTaskReturnStatus.addSuccessMsg(successMsg); getCurTask().setVoRTaskReturnStatus(voRTaskReturnStatus); } /** * 运行错误继续进行 * param voRTaskReturnStatus 错误信息vo */ public void runReturnContinueByError(VoRTaskReturnStatus voRTaskReturnStatus){ getCurTask().setTaskStep(EnumTaskStep.runReturnContinue); getCurTask().setVoRTaskReturnStatus(voRTaskReturnStatus); } /** * 运行返回成功 只把内容标志为成功 未新增返回内容 * param log * param successMsg */ public void runReturnSuccessOnly(String log, String successMsg){ runReturnSuccessWithContent(log,successMsg,null,null); } /** * 运行返回成功带返回内容 * param log 日志 * param successMsg * param taskReturn * param taskReturnTransMethod */ public void runReturnSuccessWithContent(String log, String successMsg, String taskReturn, EnumTransMethod taskReturnTransMethod){ getCurTask().setTaskStep(EnumTaskStep.runReturnSuccess); if(StrUtil.isNotEmpty(log)){ getCurTask().addTaskLog(log); } if(StrUtil.isNotEmpty(taskReturn)){ if(taskReturnTransMethodnull){ taskReturnTransMethodEnumTransMethod.serialTrans; } //添加返回内容 getCurTask().addTaskReturn(taskReturn,taskReturnTransMethod); } if(StrUtil.isNotEmpty(successMsg)){ getCurTask().getVoRTaskReturnStatus().addSuccessMsg(successMsg); } } /** * 设置发送的内容 显示日志用 * param voRTaskSend */ public void runAddSendLogVo(VoRTaskSend voRTaskSend){ getCurTask().addTaskSend(voRTaskSend); } /** * 追加日志 * param taskLog */ public void runAddLog(String taskLog){ getCurTask().addTaskLog(taskLog); } /** * 运行结果监听: 包含超时处理, 默认500毫秒监听一次 */ public void runListener(){ ThreadUtil.sleep(this.voRConfig.getListenerReturn()); /** * 是否超时和运行完完监听时间 */ boolean timeOutfalse; Long listenAllTimenull; if(getDoFinishTime()!null){ //多次接收返回结果 以最后一次发任务的时间判断 Date nownew Date(); listenAllTimeDateUtil.between(getDoFinishTime(),now, DateUnit.MS); if(listenAllTimethis.getVoRConfig().getRTimeOut()){ timeOuttrue; } }else{ timeOutfalse; } String msggetDoFinishTime DateUtil.format(getDoFinishTime(),DatePattern.NORM_DATETIME_MS_FORMAT) listenAllTimelistenAllTime getRTimeOutthis.getVoRConfig().getRTimeOut() timeOut timeOut; if(UtilLogOpenConfi.logConfiBusOpen(RunableRTaskParent)){ log.info(msg); } if(listenAllTime!nulllistenAllTime CacheTaskConfi.maxRuableTime){ this.runFail(大于最大运行时间CacheTaskConfi.maxRuableTime设置为失败); } VoRTask voRTaskgetCurTask(); EnumTaskStep enumTaskStepCurgetCurTask().getTaskStep(); // -------------------监听的各种状态处理 if(enumTaskStepCur.equals(EnumTaskStep.runAccept)){ // ---------等待接收处理 if(!timeOut){ //接收未超时再次监听 runListener(); }else{ //超时状态 if(continueDoAgain()){ //超时尝试重发 if(voRConfig.getContinueNewRunable().equals(0)){ runContinueInThis(voRTask); }else if(voRConfig.getContinueNewRunable().equals(1)){ runContinueToNew(); runEndTimeOut(); return; } }else{ runEndTimeOut(); return; } } } else if(enumTaskStepCur.equals((EnumTaskStep.runReturnParse))){ // ---------等待解析返回结果处理 //串口监听到数据将任务设置为runReturnParse 这边触发解析监听,有些任务接收到多帧可继续监听返回一直在待解析状态 //处理可能获得返回数据 有些任务接收到多帧可继续监听返回一直在待解析状态 //logCurTask(voRTask,运行返回待解析); try { this.runParseReturnDeal(voRTask); } catch (Exception e) { String emsg UtilRunTrace.getExcepCaller(e); this.runAddLog(emsg); } if(timeOut){ this.runEndTimeOut(运行返回待解析开启多次接收返回结果;任务超时); return; }else{ //进入重复监听状态 有些任务接收到多帧可继续监听返回一直在待解析状态 runListener(); } } else if(enumTaskStepCur.equals((EnumTaskStep.runReturnContinue))){ // ---------返回继续运行状态处理 //二级异常 EnumErrorLevel.errorContinue 可进入此状态 if(continueDoAgain()){ if(voRConfig.getContinueNewRunable().equals(0)){ runContinueInThis(voRTask); }else if(voRConfig.getContinueNewRunable().equals(1)){ runContinueToNew(); voRTask.setTaskStep(EnumTaskStep.runReturnSuccess); logCurTask(voRTask,继续运行); this.runEndDealSave(voRTask); return; } }else{ voRTask.setTaskStep(EnumTaskStep.runReturnFail); logCurTask(voRTask,继续运行超过上限); this.runEndDealSave(voRTask); return; } } else if(enumTaskStepCur.equals((EnumTaskStep.runReturnSuccess))){ //超时状态 if(this.getCurTask().getVoRConfig().getMaxForceRunTimesSuccessOpen()continueDoAgain()){ //超时尝试重发 if(voRConfig.getContinueNewRunable().equals(0)){ runContinueInThis(voRTask); }else if(voRConfig.getContinueNewRunable().equals(1)){ runContinueToNew(); // ----------任务成功状态处理 this.runEndDealSave(voRTask); return; } }else{ // ----------任务成功状态处理 this.runEndDealSave(voRTask); return; } }else if(enumTaskStepCur.equals(EnumTaskStep.runReturnFail)){ // ----------返回异常 //一级异常 EnumErrorLevel.errorKillCur 杀死本任务 进入本步骤 if(this.getCurTask().getTaskRunTimes()this.voRConfig.getRTimesTryError()){ //异常继续处理 logCurTask(voRTask,); this.runFlow(); }else{ voRTask.setTaskStep(EnumTaskStep.runReturnFail); logCurTask(voRTask,); this.runEndDealSave(voRTask); return; } } } /** * 是否再次运行 * 先判断如果设置了最大运行时间 根据时间判断 * 后判断如果最大运行次数设置1 则根据次数判断 * return */ private boolean continueDoAgain(){ boolean refalse; // 如果设置了最大运行时间 根据时间判断 if(this.getVoRConfig().getMaxRunMs()!null){ Date nownew Date(); Date beginDateUtil.parse(this.getCurTask().getTaskBegTime()); long useMsDateUtil.betweenMs(begin,now); if(useMsthis.getVoRConfig().getMaxRunMs()){ retrue; }else{ logCurTask(getCurTask(),停止运行时长:useMs最大时长:this.getVoRConfig().getMaxRunMs()); } } // 如果最大运行次数设置1 则根据次数判断 else if(this.getVoRConfig().getMaxForceRunTimes()1){ if(this.getCurTask().getTaskRunTimes()this.getVoRConfig().getMaxForceRunTimes()){ retrue; } } return re; } /** * 在原来的任务上重新运行 【任务通知继续运行,或者超时的时候进入】 * param voRTask 任务 */ private void runContinueInThis(VoRTask voRTask){ logCurTask(voRTask,解析返回结果,继续运行任务); //新增避免运行太快 if(this.voRConfig.getForceTaskTimeMs()!null){ Long msDateUtil.betweenMs(DateUtil.parse(voRTask.getTaskThisRunTime()),new Date()); Integer needDealyTimethis.voRConfig.getForceTaskTimeMs().intValue()-ms.intValue(); if(needDealyTime0){ ThreadUtil.sleep(needDealyTime); logCurTask(voRTask,,本任务再次运行强制延时this.voRConfig.getForceTaskTimeMs()毫秒,已运行ms.longValue(),剩余needDealyTime延时); } } this.runFlow(); } /** * 生成新的任务 【任务通知继续运行,或者超时的时候进入】 * 如果是优先级队列则按照类型放到本类型的后面 * 如果是顺序队列则放到最后面运行[这个是缺点] * 根据本任务的最长运行时间来设置,如果超出时间则不再次运行 */ private void runContinueToNew(){ ListVoRTask tasksnew ArrayList(); VoRTask voRTaskRunAgainnew VoRTask(); BeanUtil.copyProperties(this.getCurTask(),voRTaskRunAgain); voRTaskRunAgain.setVoRTaskReturns(new ArrayList()); voRTaskRunAgain.setVoRTaskSends(new ArrayList()); voRTaskRunAgain.setTaskLog(); voRTaskRunAgain.setTaskThisRunTime(); voRTaskRunAgain.setTaskStep(EnumTaskStep.runWait); voRTaskRunAgain.setVoRTaskReturnStatus(new VoRTaskReturnStatus()); if(voRTaskRunAgain.getVoRConfig().getEnumQueueType().equals(EnumQueueType.priorityBlockingQueue)){ voRTaskRunAgain.iniVoTaskPriority(voRTaskRunAgain.getVoTaskPriority()); } tasks.add(voRTaskRunAgain); TaskRunOneLimit.runOneLimitAdd(tasks); } /** * 任务结束 */ private void runEnd(){ VoRTask voRTaskgetCurTask(); logCurTask(voRTask,DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_FORMAT)结束); if(this.voRConfig.getOverDealyContinue()!nullthis.voRConfig.getOverDealyContinue()0){ logCurTask(voRTask,,强制延时this.voRConfig.getOverDealyContinue()毫秒); ThreadUtil.sleep(this.voRConfig.getOverDealyContinue()); } if(this.voRConfig.getForceTaskTimeMs()!null){ Long msDateUtil.betweenMs(DateUtil.parse(voRTask.getTaskThisRunTime()),new Date()); Integer needDealyTimethis.voRConfig.getForceTaskTimeMs().intValue()-ms.intValue(); if(needDealyTime0){ ThreadUtil.sleep(needDealyTime); logCurTask(voRTask,,强制运行满this.voRConfig.getForceTaskTimeMs()毫秒,已运行ms.longValue(),剩余needDealyTime延时); } } logCurTask(voRTask,,进入下一步); voRTask.setTaskEndTime(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_FORMAT)); if(StrUtil.isNotEmpty(voRTask.getTaskBegTime()) StrUtil.isNotEmpty(voRTask.getTaskEndTime())){ try { Long userMsV DateUtil.betweenMs(DateUtil.parse(voRTask.getTaskBegTime(), DatePattern.NORM_DATETIME_MS_FORMAT), DateUtil.parse(voRTask.getTaskEndTime(), DatePattern.NORM_DATETIME_MS_FORMAT)); String allUsMsuserMsV.toString(); voRTask.setAllUsMs(allUsMs); } catch (Exception e) { log.error(e.getMessage()); } } if(StrUtil.isNotEmpty(voRTask.getTaskThisRunTime()) StrUtil.isNotEmpty(voRTask.getTaskEndTime())){ try { Long curUsMsVDateUtil.betweenMs(DateUtil.parse(voRTask.getTaskThisRunTime(), DatePattern.NORM_DATETIME_MS_FORMAT), DateUtil.parse(voRTask.getTaskEndTime(), DatePattern.NORM_DATETIME_MS_FORMAT)); String curUsMscurUsMsV.toString(); voRTask.setCurUsMs(curUsMs); } catch (Exception e) { log.error(e.getMessage()); } } StatiCacheTask.runAllTaskLogInfoAll(this.runId); } /** * 当前任务运行日志 * param voRTask * param logCont */ private void logCurTask(VoRTask voRTask,String logCont){ voRTask.addTaskLog(logCont); LogsTask.getTaskOneLog(logCont ,voRTask); } }需要私信咨询

相关文章:

Java 上位机防空警报系统开发

通讯结构中央站 -区域站-终端支持全控 选控 单控。可诊断每个设备回示记录通讯协议 使用modbus相关核心代码通讯线程池package com.common.buscomm.taskRun.base.runable;import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core…...

BetterJoy完全指南:让Switch控制器完美适配PC的7个专业技巧

BetterJoy完全指南:让Switch控制器完美适配PC的7个专业技巧 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode…...

华硕笔记本合盖模式终极指南:告别外接显示器休眠烦恼

华硕笔记本合盖模式终极指南:告别外接显示器休眠烦恼 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sca…...

3步打造个性化Windows任务栏:轻量级桌面美化工具TranslucentTB使用指南

3步打造个性化Windows任务栏:轻量级桌面美化工具TranslucentTB使用指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否…...

实战演练:将idea ai插件的灵感在快马平台转化为可部署的全栈博客管理系统

今天想和大家分享一个实战经验:如何把IDEA AI插件产生的灵感快速转化为一个可部署的全栈博客管理系统。整个过程在InsCode(快马)平台上完成,从构思到上线只用了不到一小时,特别适合想要快速验证想法的开发者。 从IDEA插件到完整项目 平时用…...

3步攻克NCM加密壁垒:让音乐文件重获跨设备自由

3步攻克NCM加密壁垒:让音乐文件重获跨设备自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 当你从音乐平台下载的NCM格式文件无法在车载音响、MP3播放器等设备播放时,是否感到束手无策?ncmdump…...

Phi-3-mini-4k-instruct-gguf真实案例:制造业设备说明书故障排查话术生成

Phi-3-mini-4k-instruct-gguf真实案例:制造业设备说明书故障排查话术生成 1. 场景痛点分析 在制造业设备维护领域,技术工程师每天需要处理大量设备故障咨询。传统方式存在几个典型问题: 响应效率低:工程师需要反复查阅厚重的纸…...

查询直线的条数

#include <iostream> #include <vector> #include <set> #include <numeric> // For std::gcdusing namespace std;// 定义点结构 struct Point {int x, y; };// 定义直线结构&#xff0c;通过最简斜率和直线上的一点来唯一标识 // 实际上更好的办法是…...

运算放大器电流流向的5个常见误区:硬件工程师都踩过哪些坑?

运算放大器电流流向的5个常见误区&#xff1a;硬件工程师都踩过哪些坑&#xff1f; 在硬件设计领域&#xff0c;运算放大器就像一位沉默的舞者——看似动作简单&#xff0c;实则每个细节都暗藏玄机。记得我第一次调试仪表放大电路时&#xff0c;盯着示波器上诡异的电流波形百思…...

在线数据处理工具

推荐一个好用的在线数据处理工具&#xff0c;程序员必备 作为程序员&#xff0c;经常需要处理各种文本数据。今天推荐10个超好用的在线工具&#xff0c;每个都能帮你节省大量时间。 1. 文本去重工具 地址&#xff1a;https://www.aiyun1.cloud/dedup 功能&#xff1a;一键去除…...

PyTorch 2.8镜像基础教程:NumPy/Pandas数据预处理与torch.Tensor转换要点

PyTorch 2.8镜像基础教程&#xff1a;NumPy/Pandas数据预处理与torch.Tensor转换要点 1. 环境准备与快速验证 在开始数据预处理之前&#xff0c;我们需要先确认PyTorch环境已经正确配置并能够使用GPU加速。这个预装PyTorch 2.8的镜像已经为我们准备好了所有必要的组件。 1.1…...

Hunyuan-MT-7B功能体验:少数民族语言翻译效果实测与对比

Hunyuan-MT-7B功能体验&#xff1a;少数民族语言翻译效果实测与对比 1. 引言&#xff1a;少数民族语言翻译的技术挑战 在全球化与数字化浪潮中&#xff0c;语言障碍始终是跨文化交流的重要壁垒。对于主流语言如英语、汉语等&#xff0c;机器翻译技术已相对成熟。然而&#xf…...

小白也能懂!Meta-Llama-3-8B-Instruct快速上手全攻略

小白也能懂&#xff01;Meta-Llama-3-8B-Instruct快速上手全攻略 1. 为什么选择Meta-Llama-3-8B-Instruct Meta-Llama-3-8B-Instruct是Meta公司2024年4月开源的中等规模语言模型&#xff0c;特别适合想要体验高质量AI对话但硬件配置有限的开发者。这个80亿参数的模型在单张RT…...

RavenDB全文搜索与NGram分析器的实际应用

引言 在现代的数据库系统中,全文搜索功能已成为一个不可或缺的部分。RavenDB,作为一个强大的NoSQL数据库,提供了丰富的文本搜索功能。特别是通过使用NGram分析器,可以大大提升搜索的灵活性和准确性。本文将深入探讨RavenDB的全文搜索机制,特别是NGram分析器在索引和查询时…...

lychee-rerank-mm行业方案:文旅部门景区图片库按游客搜索词智能排序

Lychee-rerank-mm行业方案&#xff1a;文旅部门景区图片库按游客搜索词智能排序 1. 项目背景与价值 文旅部门的景区图片库通常包含成千上万张照片&#xff0c;从自然风光到人文景观&#xff0c;从特色建筑到文化活动。当游客通过搜索词查找图片时&#xff0c;如何快速找到最相…...

Node.js 结合 LangChainJS 实现智能对话系统的实战探索

1. 为什么选择Node.js和LangChainJS构建智能对话系统 最近几年&#xff0c;智能对话系统已经成为开发者工具箱里的标配。作为一个在AI领域摸爬滚打多年的老手&#xff0c;我发现Node.js和LangChainJS的组合特别适合快速搭建这类系统。Node.js的异步非阻塞特性让它天生适合处理对…...

Jimeng LoRA动态热切换实战:避免显存爆炸,轻松测试多训练阶段模型

Jimeng LoRA动态热切换实战&#xff1a;避免显存爆炸&#xff0c;轻松测试多训练阶段模型 1. 项目背景与核心价值 你是否遇到过这样的困扰&#xff1a;在测试不同训练阶段的LoRA模型时&#xff0c;每次切换版本都需要重新加载底座模型&#xff0c;不仅耗时耗力&#xff0c;还…...

JS手撕:DOM操作 浏览器API高频场景详解

在前端开发中&#xff0c;我们经常会遇到一些重复且基础的需求——比如解析URL参数、给大量元素绑定点击事件、实现图片懒加载等。这些功能看似简单&#xff0c;但写得不够严谨就容易出现bug&#xff08;比如中文参数乱码、事件绑定冗余、滚动加载卡顿&#xff09;。 今天就整理…...

Pixel Dimension Fissioner 社交媒体内容生成:自动化生产像素风格营销图片

Pixel Dimension Fissioner 社交媒体内容生成&#xff1a;自动化生产像素风格营销图片 1. 社交媒体运营的视觉内容困境 每天打开社交媒体后台&#xff0c;运营团队最头疼的问题总是惊人的一致&#xff1a;内容不够发。特别是需要大量视觉素材的节日营销期&#xff0c;设计师加…...

Ollama部署Phi-3-mini完整指南:从安装到实战应用场景解析

Ollama部署Phi-3-mini完整指南&#xff1a;从安装到实战应用场景解析 1. 为什么选择Phi-3-mini-4k-instruct&#xff1f; Phi-3-mini-4k-instruct是微软推出的轻量级AI模型&#xff0c;虽然只有38亿参数&#xff0c;但在多个基准测试中表现优异。这个模型特别适合需要快速部署…...

3个颠覆性技巧:NVIDIA Profile Inspector如何释放显卡隐藏性能

3个颠覆性技巧&#xff1a;NVIDIA Profile Inspector如何释放显卡隐藏性能 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专业的显卡参数配置工具&#xff0c;能够深度…...

3分钟掌握OpenSpeedy:完全免费的开源游戏变速工具终极指南

3分钟掌握OpenSpeedy&#xff1a;完全免费的开源游戏变速工具终极指南 【免费下载链接】OpenSpeedy &#x1f3ae; An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy OpenSpeedy是一款专为Windows平台设计的开源游戏变速工…...

Windows下OpenClaw安装指南:快速对接Phi-3-vision-128k-instruct图文模型

Windows下OpenClaw安装指南&#xff1a;快速对接Phi-3-vision-128k-instruct图文模型 1. 环境准备与安装 在Windows系统上部署OpenClaw需要先确保基础环境就绪。我使用的是Windows 11专业版22H2版本&#xff0c;整个过程大约需要15分钟。建议提前准备管理员权限的PowerShell窗…...

Nunchaku-flux-1-dev多场景落地:图文创作、副业接单、PPT配图、表情包生成一文覆盖

Nunchaku-flux-1-dev多场景落地&#xff1a;图文创作、副业接单、PPT配图、表情包生成一文覆盖 1. 引言&#xff1a;你的本地AI画师&#xff0c;不止于想象 想象一下&#xff0c;你正在为一个公众号文章找配图&#xff0c;翻遍了图库网站&#xff0c;要么风格不搭&#xff0c…...

Nano-Banana模型安全防护:对抗样本检测与防御

Nano-Banana模型安全防护&#xff1a;对抗样本检测与防御 在AI模型日益普及的今天&#xff0c;安全性已成为不可忽视的核心议题。Nano-Banana模型通过引入先进的对抗样本检测与防御机制&#xff0c;在鲁棒性上实现了显著突破&#xff0c;有效提升了模型在复杂环境下的可靠性。…...

影墨·今颜保姆级教程:24GB显卡上跑FLUX.1-dev高清人像生成

影墨今颜保姆级教程&#xff1a;24GB显卡上跑FLUX.1-dev高清人像生成 1. 教程前言&#xff1a;从零开始掌握高端AI人像生成 你是否曾经被AI生成的人像那种"塑料感"所困扰&#xff1f;想要创作出具有电影质感、极致真实的时尚人像&#xff0c;却苦于没有合适的技术方…...

C++ constexpr 编译期逻辑实践

C constexpr 编译期逻辑实践&#xff1a;探索现代C的静态计算潜能 在现代C中&#xff0c;constexpr关键字彻底改变了编译期计算的可能性。它允许开发者在编译阶段执行复杂逻辑&#xff0c;从而提升运行时效率并实现更严格的类型安全。从C11的初版到C20的增强&#xff0c;const…...

Qwen3.5-4B模型在VS Code中的集成:打造个人AI编程工作站

Qwen3.5-4B模型在VS Code中的集成&#xff1a;打造个人AI编程工作站 1. 前言&#xff1a;为什么要在VS Code中集成Qwen3.5-4B 作为一名开发者&#xff0c;你可能已经习惯了在各种在线平台上使用AI辅助编程。但有没有想过&#xff0c;把这些能力直接搬到你的本地开发环境中&am…...

Wan2.2-T2V-A5B在自媒体场景实战:批量生成诗意文案短视频

Wan2.2-T2V-A5B在自媒体场景实战&#xff1a;批量生成诗意文案短视频 1. 为什么自媒体需要轻量级视频生成工具 在内容创作领域&#xff0c;短视频已经成为最主流的内容形式之一。特别是结合诗意文案的短视频&#xff0c;在各大平台都拥有极高的用户粘性和传播度。然而&#x…...

零基础玩转YOLO11目标跟踪:完整环境一键部署教程

零基础玩转YOLO11目标跟踪&#xff1a;完整环境一键部署教程 1. 环境准备与快速部署 1.1 系统要求 操作系统&#xff1a;Linux (推荐Ubuntu 20.04/22.04)硬件配置&#xff1a; GPU&#xff1a;NVIDIA显卡 (建议RTX 3060及以上)显存&#xff1a;至少8GB内存&#xff1a;16GB及…...