QtService:跨平台Qt应用服务化实战指南
简介这是一份面向Qt5开发者的服务后台开发辅助资源基于Qt4时代qt-solutions项目的QtService库完成全面迁移与适配专为需要在Windows/Linux平台构建稳定系统服务的中高级Qt工程师设计。资源包含52个文件涵盖8个核心cpp/h源码文件、4个vcxproj工程配置及filters过滤文件、4个pro项目文件、10个HTML文档和4个qdoc技术说明辅以PNG图标、CSS样式、Makefile编译脚本及README等配套内容整体压缩包仅96KB轻量易集成。已有2459人学习下载验证了其在多个实际项目中的可靠性。用户可直接复用已调试通过的服务启动/停止/安装/卸载逻辑快速获得跨平台服务封装能力同时支持64位编译定制工程结构清晰含Unix域套接字通信qtunixsocket、Windows服务封装qtservice_win及私有头文件qtservice_p.h等关键模块便于按需裁剪与二次开发。1. QtService 不是 Qt 官方模块但它让 Qt 程序真正“活”在 Windows/Linux 后台一个被低估的跨平台服务封装层你写了个 Qt 工具功能完整、界面清爽但一关终端窗口就崩一登出用户会话就停想注册成系统服务Windows 上得啃 SCM 文档、Linux 上得配 systemd unit 文件——而 Qt 本身压根不提供 service 生命周期管理。这时候 QtService 就不是“可选”而是刚需。它不是 Qt 官方维护的模块注意Qt5.15 的 Qt Add-Ons 里也没有它而是一个由社区长期演进、专为 Qt 应用嵌入系统服务模型而生的轻量级 C 库。它不替代 Qt Core也不重写进程模型而是用极小的侵入性把QCoreApplication包裹进 Windows Service Control ManagerSCM或 Linux systemd 兼容的守护进程框架中。典型适用场景包括工业现场采集客户端、边缘设备本地代理、后台日志聚合器、无 GUI 的协议转换桥接器。它不解决网络通信或数据处理逻辑但解决了“你的 Qt 程序能不能像sshd或nginx那样在无人值守时稳定驻留、响应系统启停信号、记录服务日志到系统日志设施”。如果你正卡在“Qt 写完了却部署不出去”这一步QtService 就是你漏掉的那块关键拼图。2. 编译 QtService从源码到静态/动态库必须绕开 Qt5 的 moc 路径陷阱与平台宏冲突QtService 的源码结构干净但编译环节藏着几个容易翻车的点。它不提供预编译二进制必须自己构建且其 CMakeLists.txt 对 Qt5 的路径探测逻辑在某些环境下尤其是多 Qt 版本共存、Qt 安装路径含空格或中文会失效。下面以 Qt5.15.2 MSVC2019Windows和 Qt5.12.12 GCC 9.4Ubuntu 20.04双平台实测为准给出可复现步骤。2.1 下载源码并确认版本边界QtService 项目已迁移到 GitHub当前主流稳定分支是v5.9.0对应 Qt5 全系列兼容性最佳。不要用 master 分支——它已转向 Qt6 支持对 Qt5 项目反而引入QMetaObject::invokeMethod的 Qt6-only 重载导致编译失败。执行git clone --branch v5.9.0 --depth 1 https://github.com/qtproject/qt-solutions.git cd qt-solutions/qtservice提示qt-solutions是父仓库包含多个独立组件如qtsingleapplicationqtservice是其子目录。不要 cd 错路径否则 CMake 找不到CMakeLists.txt。2.2 Windows 平台用 qmake 生成 vcxproj 前必须手动补全 moc 依赖链QtService 使用了 Q_OBJECT 宏如QtServiceBase类因此必须经 moc 处理。但它的CMakeLists.txt默认未显式调用qt5_wrap_cpp导致 VS 编译时提示moc_qtservicebase.cpp : No such file or directory。这不是环境变量问题是 CMakeLists 缺失 moc 规则。解决方案在qt-solutions/qtservice/CMakeLists.txt末尾追加# --- BEGIN: QtService moc fix for Qt5 --- set(QT_SERVICE_MOC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/qtservice.h ${CMAKE_CURRENT_SOURCE_DIR}/qtservicebase.h ) qt5_wrap_cpp(QT_SERVICE_MOC_SRCS ${QT_SERVICE_MOC_HEADERS}) # --- END: QtService moc fix for Qt5 ---然后执行以 Qt5.15.2 x64 Native Tools Command Prompt for VS2019 为例mkdir build cd build cmake -G Visual Studio 16 2019 Win64 ^ -DCMAKE_PREFIX_PATHD:/Qt/5.15.2/msvc2019_64 ^ -DQt5_DIRD:/Qt/5.15.2/msvc2019_64/lib/cmake/Qt5 ^ .. cmake --build . --config Release --target INSTALL参数说明-DCMAKE_PREFIX_PATH指向 Qt 安装根目录非 lib/cmake 子目录这是 CMake 查找 Qt5Config.cmake 的关键路径-DQt5_DIR是冗余保险项确保 Qt5 模块定位不漂移。若提示Could NOT find Qt5Core90% 是这两个路径写错了层级。2.3 Linux 平台systemd 支持需显式开启且必须链接-lsystemdUbuntu 20.04 默认安装libsystemd-dev但 QtService 的 CMakeLists 默认关闭 systemd 支持。若跳过此步编译出的库在 Linux 上只能跑fork()setsid()模式无法注册为真正的 systemd service即systemctl start myapp.service会失败。启用方式cd qt-solutions/qtservice/build cmake -DCMAKE_BUILD_TYPERelease \ -DQt5_DIR/opt/Qt5.12.12/5.12.12/gcc_64/lib/cmake/Qt5 \ -DQT_SERVICE_ENABLE_SYSTEMDON \ .. make -j$(nproc) sudo make install注意-DQT_SERVICE_ENABLE_SYSTEMDON是硬性开关不加则qtservice_unix.cpp中#ifdef QT_SERVICE_SYSTEMD分支完全不编译后续QtServiceController::installService()在 Linux 上将静默返回 false。另外make install默认安装到/usr/local若需覆盖系统路径如/usr/lib/x86_64-linux-gnu加-DCMAKE_INSTALL_LIBDIRlib/x86_64-linux-gnu。2.4 输出产物验证确认生成的是 Qt5 兼容 ABI 库编译成功后检查输出目录Windows 为build/Release/Linux 为build/lib/是否存在以下文件文件名说明必须存在Qt5Service.lib(Win) /libQt5Service.a(Linux)静态库链接时用-lQt5Service✅Qt5Service.dll(Win) /libQt5Service.so(Linux)动态库运行时加载✅推荐动态链接便于调试QtService目录含qtservice.h,qtservicebase.h头文件必须复制到项目 include 路径✅验证 ABI 兼容性在 Qt5.15.2 环境下编译出的Qt5Service.dll不能直接用于 Qt5.12.12 项目反之亦然因 Qt5 的 ABI 在小版本间不保证兼容。若混用运行时大概率触发Qt5Core.dll符号解析失败或QMetaObjectvtable 偏移错乱。血泪经验你的 QtService 库必须和主程序使用完全相同的 Qt5 版本与编译器MSVC/GCC 版本。3. 将 Qt 应用改造成服务从继承QtServiceBase到注册/启动/停止全流程闭环QtService 的核心抽象是QtServiceBase类它接管了QCoreApplication的事件循环并注入服务生命周期钩子。改造不是“加个插件”而是重构应用入口。下面以一个最简日志上报工具LogReporter为例展示完整改造链。3.1 继承QtServiceBase并实现四大虚函数你的主类不再继承QApplication或QCoreApplication而是继承QtServiceBase。关键点必须重写全部四个纯虚函数缺一不可否则链接时报undefined reference to QtServiceBase::start()。// logreporterservice.h #ifndef LOGREPORTERSERVICE_H #define LOGREPORTERSERVICE_H #include QtServiceBase #include QTimer class LogReporterService : public QtServiceBase { Q_OBJECT public: explicit LogReporterService(int argc, char **argv); ~LogReporterService() override; protected: void start() override; // 【必须】服务启动时调用等价于 main() 业务入口 void stop() override; // 【必须】服务停止时调用清理资源 void pause() override; // 【可选但建议】暂停时调用如暂停日志采集 void resume() override; // 【可选但建议】恢复时调用如重启采集 private slots: void onReportTimeout(); private: QTimer *m_reportTimer; }; #endif // LOGREPORTERSERVICE_H逻辑说明start()是你原有main()中业务逻辑的迁移地stop()必须做同步阻塞清理如关闭网络连接、flush 日志缓冲区因为系统发STOP信号后进程只有有限时间退出pause/resume在 Windows SCM 中对应SERVICE_PAUSE_CONTINUE状态在 Linux systemd 中需配合Typenotify和sd_notify()实现非必需但能提升服务可观测性。3.2main()函数用QtServiceController启动而非QApplication::exec()main()不再创建 QApplication而是创建QtServiceController实例并传入你的服务类类型。这是 QtService 的“门面”。// main.cpp #include QtServiceController #include logreporterservice.h int main(int argc, char *argv[]) { // 创建控制器模板参数为你的服务类 QtServiceControllerLogReporterService controller(argc, argv); // 解析命令行参数-install, -uninstall, -start, -stop, -pause, -resume // 这些参数由 QtService 内置解析无需自己写 getopt return controller.exec(); }参数说明controller.exec()会自动识别标准服务控制参数./logreporter -install→ 调用installService()注册服务Windows 写注册表Linux 写.service文件./logreporter -uninstall→ 调用uninstallService()卸载./logreporter -start→ 启动已注册的服务Windows 发 SCM 启动请求Linux 调systemctl start./logreporter -console→ 以控制台模式运行调试必备绕过服务环境直接进start()玄学提醒-console模式下QtServiceBase::isService()返回 false所有if (isService())分支被跳过这是调试时唯一能 printf 的安全通道。3.3start()中启动业务逻辑用QTimer替代while(1)死循环服务进程禁止阻塞主线程。原while(1) { doWork(); sleep(1000); }必须改为 Qt 事件驱动。// logreporterservice.cpp #include logreporterservice.h #include QDebug #include QFile #include QStandardPaths LogReporterService::LogReporterService(int argc, char **argv) : QtServiceBase(argc, argv) , m_reportTimer(new QTimer(this)) { // 设置服务元信息仅 Windows 有效Linux 忽略 setServiceName(LogReporter); setServiceDisplayName(Log Reporter Service); setServiceDescription(Collects and uploads local logs to central server); // 关键连接定时器避免 start() 返回后进程退出 connect(m_reportTimer, QTimer::timeout, this, LogReporterService::onReportTimeout); } void LogReporterService::start() { qDebug() LogReporterService: Starting in service mode; // 初始化业务资源打开日志文件、建立网络连接等 QFile logFile(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) /report.log); if (!logFile.open(QIODevice::Append | QIODevice::Text)) { qCritical() Failed to open log file: logFile.errorString(); return; // 服务启动失败SCM/systemd 会标记为 failed } // 启动定时上报每 30 秒一次 m_reportTimer-start(30000); } void LogReporterService::stop() { qDebug() LogReporterService: Stopping...; m_reportTimer-stop(); // 停止定时器 // 同步 flush 日志、关闭 socket、释放句柄 // ⚠️ 这里必须是同步操作不能 emit signal 让其他线程处理 // 因为 stop() 返回后进程可能被 OS 强制终止 } void LogReporterService::onReportTimeout() { qDebug() LogReporterService: Reporting logs...; // 实际上报逻辑读取日志、压缩、HTTP POST... }关键细节start()中不能有QEventLoop::exec()或QThread::exec()因为QtServiceBase已托管主事件循环所有耗时操作如网络请求必须用QNetworkAccessManager异步完成或起QThread并moveToThreadstop()中的清理必须在 30 秒内完成Windows SCM 默认超时 30ssystemd 默认TimeoutStopSec90否则服务被强制 kill数据丢失。3.4 构建与链接CMakeLists.txt 中正确引入 QtService你的应用CMakeLists.txt必须显式链接 QtService 库并确保头文件路径正确# CMakeLists.txt for LogReporter cmake_minimum_required(VERSION 3.10) project(LogReporter) set(CMAKE_CXX_STANDARD 11) # 查找 Qt5必须在 find_package(Qt5Service) 之前 find_package(Qt5 REQUIRED COMPONENTS Core Network Widgets) # 查找 QtService假设已 install 到系统路径 find_package(Qt5Service REQUIRED) # 添加可执行文件 add_executable(LogReporter main.cpp logreporterservice.cpp) # 链接 Qt 模块 QtService target_link_libraries(LogReporter Qt5::Core Qt5::Network Qt5::Widgets Qt5Service # ← 关键链接 QtService 库 ) # 头文件包含QtService install 后头文件在 /usr/local/include/QtService target_include_directories(LogReporter PRIVATE ${Qt5Service_INCLUDE_DIRS} # 通常为 /usr/local/include )注意find_package(Qt5Service REQUIRED)依赖Qt5ServiceConfig.cmake文件该文件由make install生成。若自定义 install 路径如/opt/mylibs需设置CMAKE_PREFIX_PATH/opt/mylibs或导出Qt5Service_DIR/opt/mylibs/lib/cmake/Qt5Service。4. 避坑Windows 服务注册失败、Linux systemd 启动超时、QtService 日志消失的五大真实踩坑记录QtService 表面简单但部署阶段的报错极其隐蔽。以下是某开发者在产线部署LogReporter时踩过的 5 个高频坑按“现象→原因→解决”结构整理每一条都来自真实journalctl -u myservice或 Windows 事件查看器日志。4.1 现象Windows 上sc create成功但sc start报 1053 错误服务未及时响应原因start()函数执行超过 30 秒或内部抛出未捕获异常导致QtServiceBase::start()未正常返回。SCM 要求服务进程在 30 秒内进入SERVICE_RUNNING状态否则标记为超时。解决在start()开头加qDebug() start() begin;结尾加qDebug() start() end;用-console模式运行看是否卡住检查是否有阻塞 IO如QFile::open()等待 NFS 挂载、DNS 解析QHostInfo::fromName()同步调用所有耗时操作必须异步化start()本身应秒级返回。4.2 现象Linux 上systemctl start myservice显示activating (auto-restart)循环journalctl无任何输出原因QtServiceBase::isService()在 Linux 下依赖getppid() ! 1判断是否为服务进程但 systemd 启动时父进程 ID 可能为 1PID 1 是 systemd导致isService()返回 falsestart()根本不执行。解决必须启用 systemd 支持编译见 2.3 节-DQT_SERVICE_ENABLE_SYSTEMDON检查qtservice_unix.cpp中#ifdef QT_SERVICE_SYSTEMD是否生效grep 宏定义确认systemd服务文件中Type设置为simple默认或notify需sd_notify()配合不能设为forking。4.3 现象服务启动后qDebug()输出消失Windows 事件日志/journalctl中看不到任何日志原因QtService 默认禁用qDebug输出到控制台。在服务环境下stdout/stderr被重定向qDebug默认不写入系统日志。解决在main()中controller.exec()前安装自定义消息处理器#include QMessageLogger void serviceMessageHandler(QtMsgType type, const QMessageLogContext context, const QString msg) { QByteArray localMsg msg.toLocal8Bit(); switch (type) { case QtDebugMsg: // 写入 Windows 事件日志或 Linux syslog #ifdef Q_OS_WIN OutputDebugStringA(localMsg.constData()); #else syslog(LOG_INFO, %s, localMsg.constData()); #endif break; // ... 其他类型 } } int main(int argc, char *argv[]) { qInstallMessageHandler(serviceMessageHandler); QtServiceControllerLogReporterService controller(argc, argv); return controller.exec(); }提示Linux 下需#include syslog.h并在CMakeLists.txt中target_link_libraries(... -lsyslog)Windows 下OutputDebugStringA需#include windows.h。4.4 现象-install成功但sc query显示STATE: 4 RUNNING实际业务未执行原因QtServiceBase::start()已执行但业务逻辑如QTimer未启动或QTimer::start()被调用但QEventLoop未运行。解决确认QtServiceBase构造函数中m_serviceState被正确初始化检查start()中是否遗漏m_timer-start()用-console模式运行确认qDebug()能打印 “start() end”再确认onReportTimeout是否被触发加qDebug() timer fired。4.5 现象服务卸载后Windows 注册表残留HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LogReporter原因-uninstall只删除服务项不清理HKEY_LOCAL_MACHINE\SOFTWARE\YourCompany\LogReporter等自定义键值。解决在stop()或析构函数中用QSettings手动清理void LogReporterService::~LogReporterService() { // 清理自定义注册表项Windows only #ifdef Q_OS_WIN QSettings settings(HKEY_LOCAL_MACHINE\\SOFTWARE\\MyCompany\\LogReporter, QSettings::NativeFormat); settings.clear(); // 删除整个键 #endif }注意QSettings在stop()中调用可能不安全服务已停止事件循环退出建议放在析构函数中且加#ifdef Q_OS_WIN宏保护。5. 进阶技巧用 QtService 实现服务热更新、跨平台日志路由、以及 systemd 通知集成QtService 的能力远不止“让程序后台跑”。当它与 Qt5 的现代特性结合能解决更复杂的运维需求。下面三个技巧是我在线上系统中反复验证过的实战方案每个都附可直接粘贴的代码。5.1 技巧一服务热更新——不重启服务动态 reload 配置文件传统做法是监听SIGHUPLinux或SERVICE_CONTROL_PARAMCHANGEWindows但 QtService 已封装了跨平台信号转发。只需重写processCommand()// logreporterservice.h 中添加 protected: void processCommand(int code) override; // logreporterservice.cpp void LogReporterService::processCommand(int code) { // Windows: SCM 发送 SERVICE_CONTROL_PARAMCHANGE // Linux: systemd 发送 SIGHUP需在 service 文件中设置 KillSignalHUP if (code SERVICE_CONTROL_PARAMCHANGE || code SIGHUP) { qDebug() Received config reload signal; loadConfiguration(); // 你的配置加载函数 // 可选通知 systemd 重新加载完成 #ifdef Q_OS_LINUX sd_notify(0, RELOADING1); sd_notify(0, READY1); #endif } }systemd 配置文件logreporter.service中需添加[Service] KillSignalHUP # 其他配置...这样systemctl reload logreporter就能触发processCommand(SIGHUP)无需systemctl restart。5.2 技巧二跨平台日志路由——统一输出到 Windows 事件日志 / Linux syslog / 文件QtService 自带QtServiceController::setLogFilePath()但它是单文件输出。要实现多目标路由需自定义QMessageHandler并区分平台// 在 main() 中安装 void multiTargetMessageHandler(QtMsgType type, const QMessageLogContext context, const QString msg) { QByteArray localMsg msg.toLocal8Bit(); QString time QDateTime::currentDateTime().toString(yyyy-MM-dd hh:mm:ss.zzz); // 1. 输出到文件所有平台 static QFile logFile(C:/Logs/logreporter.log); // Windows // static QFile logFile(/var/log/logreporter.log); // Linux if (!logFile.isOpen()) { logFile.open(QIODevice::Append | QIODevice::Text); } logFile.write(QString([%1] %2\n).arg(time).arg(localMsg.constData()).toLocal8Bit()); // 2. 输出到系统日志 #ifdef Q_OS_WIN // Windows 事件日志需提前注册事件源 HANDLE hEventLog RegisterEventSourceA(nullptr, LogReporter); if (hEventLog) { LPCSTR strings[] {localMsg.constData()}; ReportEventA(hEventLog, EVENTLOG_INFORMATION_TYPE, 0, 1001, nullptr, 1, 0, strings, nullptr); DeregisterEventSource(hEventLog); } #else // Linux syslog int priority LOG_INFO; if (type QtCriticalMsg || type QtFatalMsg) priority LOG_ERR; syslog(priority, %s, localMsg.constData()); #endif }关键点RegisterEventSourceA需在 Windows 上预先用eventcreate命令注册事件源否则ReportEventA失败Linux 下syslog()需openlog(logreporter, LOG_PID, LOG_USER)初始化在main()开头调用。5.3 技巧三systemd 通知集成——让systemctl status显示实时状态Typenotify模式能让 systemd 知道服务的真实状态如STARTING,RUNNING,STOPPING而非仅靠进程存在判断。QtService 通过sd_notify()支持此特性// 在 LogReporterService::start() 中 void LogReporterService::start() { // 通知 systemd 正在启动 #ifdef Q_OS_LINUX sd_notify(0, STATUSStarting log collection...); sd_notify(0, BUSY1); #endif // ... 你的初始化代码 ... // 通知 systemd 启动完成 #ifdef Q_OS_LINUX sd_notify(0, READY1); sd_notify(0, STATUSRunning, collecting logs every 30s); sd_notify(0, BUSY0); #endif } // 在 LogReporterService::stop() 中 void LogReporterService::stop() { #ifdef Q_OS_LINUX sd_notify(0, STOPPING1); sd_notify(0, STATUSShutting down...); #endif // ... 清理代码 ... }systemd 服务文件必须启用 notify[Service] Typenotify NotifyAccessall # 其他配置...这样systemctl status logreporter就会显示● logreporter.service - Log Reporter Service Loaded: loaded (/etc/systemd/system/logreporter.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2023-10-02 14:22:33 CST; 2min 10s ago Main PID: 12345 (logreporter) Tasks: 2 (limit: 4915) Memory: 5.2M CPU: 123ms CGroup: /system.slice/logreporter.service └─12345 ./logreporter Oct 02 14:22:33 host logreporter[12345]: STATUSRunning, collecting logs every 30s从那以后我每次上线新服务都强制走一遍./myapp -console→./myapp -install→./myapp -start→journalctl -u myapp -f四步验证哪怕只是改了一行日志。因为 QtService 的坑不在编译而在服务环境与开发环境的隐式差异——它不报错只沉默。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

GitHub热榜深读:从star到commit,把开源趋势变成技术雷达

GitHub热榜深读:从star到commit,把开源趋势变成技术雷达

GitHub 热榜,尤其是每天刷新的日榜,某种程度上就是开源世界的一个“情绪探测器”。今天打开 Trending 页面,你会发现上榜项目往往能反映当下开发者最焦虑什么、最想偷懒什么、最愿意为什么样的小工具掏 star。这篇内容不打算罗列榜单&#xf…

2026/10/17 16:37:43 阅读更多 →
蝴蝶识别系统实战:细粒度图像分类与深度学习部署全链路

蝴蝶识别系统实战:细粒度图像分类与深度学习部署全链路

蝴蝶识别系统实战:从细粒度分类到部署的完整技术链路做图像分类的人第一次接触蝴蝶识别,多半会低估它的难度。看着网上那些高清蝴蝶图,觉得"不就是做个分类器嘛";真把几十个近缘物种放在一起,对着翅膀上那几…

2026/10/17 16:37:43 阅读更多 →
天健HIS数据结构手册解析:从数据字典到报表查询实战

天健HIS数据结构手册解析:从数据字典到报表查询实战

简介:天健医院信息系统数据结构手册是天健医疗HIS系统的数据库表结构说明文档,面向医院信息化工程师、数据库运维及二次开发人员,帮助快速掌握各业务模块的数据字典与表关联关系。资源包共1个doc文件,压缩包大小为7.19MB&#xff…

2026/10/17 16:37:43 阅读更多 →

最新新闻

医院管理系统数据库设计:从业务流程到核心表结构的完整推导

医院管理系统数据库设计:从业务流程到核心表结构的完整推导

简介:这份医院管理系统数据库设计文档,面向计算机相关专业学生及数据库初学者,围绕HIS系统的核心需求,梳理了医院门诊、住院、药房、财务、检查等部门的业务流程与数据关系,适合用作课程设计、毕业设计或数据库原理课程…

2026/10/17 20:55:54 阅读更多 →
信息学竞赛预选赛备考:C++基础语法与程序阅读全解析

信息学竞赛预选赛备考:C++基础语法与程序阅读全解析

简介:这是2024年海淀区中小学生信息学竞赛校级预选赛试卷,面向参赛中小学生及辅导教师,可用于考前模拟与知识查漏。试卷由编程基础知识单选题和程序阅读单选题组成,前者覆盖变量命名合法性、赋值语句写法、二进制与十进制转换、表…

2026/10/17 20:55:54 阅读更多 →
Jaeger All in One 源码深度解析:从 Span 写入到 UI 查询的完整链路

Jaeger All in One 源码深度解析:从 Span 写入到 UI 查询的完整链路

1. 从一条Trace的完整生命周期说起很多人第一次接触分布式链路追踪,都是从部署一个 All in One 的 Jaeger 实例开始的。一条命令拉起来,UI 上就能看到服务调用链,感觉这东西不过如此。但当你真正翻开 Jaeger 的源码,尤其是 All in…

2026/10/17 20:55:54 阅读更多 →
训练期动作条件化:高效实时动作分块的新思路

训练期动作条件化:高效实时动作分块的新思路

Training-Time Action Conditioning for Efficient Real-Time Chunking:全文技术解读做机器人控制、自动驾驶决策或者任何带实时响应要求的序列生成任务时,你大概率会遇到同一个矛盾:模型输出稳定性和推理延迟打架。我在折腾动作分块&#xf…

2026/10/17 20:55:54 阅读更多 →
Computer Use三层架构:动作抽象、环境感知与执行反馈工程实践

Computer Use三层架构:动作抽象、环境感知与执行反馈工程实践

1. “Computer Use”不是魔法,而是三层精密协同的工程实践“Computer Use”这个词最近在技术圈高频出现,但很多人一听到“AI操作电脑”,第一反应是科幻电影里那种全知全能、手指一划就接管整个系统的超智能体——这恰恰是理解它最大的误区。我…

2026/10/17 20:55:54 阅读更多 →
Python实现Antlr文法转语法图(铁路图):用TaoToken统一Key跑通railroad-diagrams渲染链路

Python实现Antlr文法转语法图(铁路图):用TaoToken统一Key跑通railroad-diagrams渲染链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 20:54:54 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →