Qt/C++ 调用迅雷开放下载引擎(ThunderOpenSDK)下载数据资源

目录导读

    • 前言
    • ThunderOpenSDK 简介
      • 参考 xiaomi_Thunder_Cloud 示例
      • ThunderOpenSDK 下载问题

前言

在对以前老版本的exe执行程序进行研究学习的时候,发现以前的软件是使用的ThunderOpenSDK这个迅雷开放下载引擎进行的项目数据下载,于是在网上搜索一番找到了相关内容,但是不知道为什么了相关资料相当少,不过用是真的好用,于是仔细的研究了一下。


ThunderOpenSDK 简介

ThunderOpenSDK 是一个迅雷开放下载引擎的 SDK,允许开发者在自己的应用程序中集成迅雷的下载功能。该 SDK 提供了丰富的接口,支持多种下载任务的管理,包括任务的创建、启动、停止、删除等操作。此外,SDK 还支持设置下载速度限制、代理、用户代理等功能,以满足不同应用场景的需求。
出自:ThunderOpenSDK 使用教程
相关内容参考:

  1. 迅雷开放下载引擎(ThunderOpenSDK)使用指南

  2. ThunderOpenSDK 使用教程

  3. 配置云平台ip和端口 云平台接口

  4. GitHub: ThunderOpenSDK

ThunderOpenSDK 不需要再进行编译,直接附加到项目中就能直接使用,甚至示例程序都写好了,只管调用。
GitHub示例中有0.CurUseCommonLib360Jisu_Thunder_Cloudliebao_Thunder_Cloudxiaomi_Thunder_CloudXunleiDownload_Old 5个版本的示例,
可以根据需求任选一个
在这里插入图片描述
通过查看xldl.dll文件的属性信息和Github上的声明,
我都毫不怀疑这些库文件是不是是从某个软件上扒下来的。

参考 xiaomi_Thunder_Cloud 示例

xiaomi_Thunder_Cloud 迅雷云加速开发平台版本示例;
在这里插入图片描述
打开xldl.h文件可以发现xldl.dll的接口和数据结构都已经声明好还有注释,只管调用:

  • xldl.h:
#pragma once// 所有结构体定义按1字节对齐
#pragma pack(push, 1)
struct DownTaskParam
{DownTaskParam(){memset(this, 0, sizeof(DownTaskParam));nReserved1		 = 5;bReserved			 = FALSE;DisableAutoRename	 = FALSE;IsOnlyOriginal		 = FALSE;IsResume			 = TRUE;}int nReserved;wchar_t szTaskUrl[2084];          // 任务URLwchar_t szRefUrl[2084];           // 引用页wchar_t szCookies[4096];          // 浏览器cookiewchar_t szFilename[MAX_PATH];     // 下载保存文件名.wchar_t szReserved0[MAX_PATH];wchar_t szSavePath[MAX_PATH];     // 文件保存目录HWND  hReserved;BOOL bReserved; wchar_t szReserved1[64];wchar_t szReserved2[64];BOOL IsOnlyOriginal;            // 是否只从原始地址下载UINT nReserved1;BOOL DisableAutoRename;         // 禁止智能命名BOOL IsResume;                  // 是否用续传DWORD reserved[2048];
};
enum  DOWN_TASK_STATUS
{NOITEM = 0,TSC_ERROR,TSC_PAUSE,TSC_DOWNLOAD,TSC_COMPLETE,TSC_STARTPENDING,TSC_STOPPENDING
};
enum TASK_ERROR_TYPE
{TASK_ERROR_UNKNOWN	   =			0x00,   // 未知错误TASK_ERROR_DISK_CREATE =			0x01,   // 创建文件失败TASK_ERROR_DISK_WRITE =				0x02,   // 写文件失败TASK_ERROR_DISK_READ =				0x03,   // 读文件失败TASK_ERROR_DISK_RENAME =			0x04,   // 重命名失败TASK_ERROR_DISK_PIECEHASH =			0x05,   // 文件片校验失败TASK_ERROR_DISK_FILEHASH =			0x06,   // 文件全文校验失败TASK_ERROR_DISK_DELETE =			0x07,   // 删除文件失败失败TASK_ERROR_DOWN_INVALID =			0x10,   // 无效的DOWN地址TASK_ERROR_PROXY_AUTH_TYPE_UNKOWN = 0x20,   // 代理类型未知TASK_ERROR_PROXY_AUTH_TYPE_FAILED = 0x21,   // 代理认证失败TASK_ERROR_HTTPMGR_NOT_IP =			0x30,   // http下载中无ip可用TASK_ERROR_TIMEOUT =				0x40,   // 任务超时TASK_ERROR_CANCEL =					0x41,   // 任务取消TASK_ERROR_TP_CRASHED=              0x42,   // MINITP崩溃TASK_ERROR_ID_INVALID =             0x43,   // TaskId 非法
};
struct DownTaskInfo
{DownTaskInfo(){memset(this, 0, sizeof(DownTaskInfo));stat		= TSC_PAUSE;fail_code	= TASK_ERROR_UNKNOWN;fPercent = 0;bIsOriginUsable = false;fHashPercent = 0;}DOWN_TASK_STATUS	stat;TASK_ERROR_TYPE		fail_code;wchar_t		szFilename[MAX_PATH];wchar_t		szReserved0[MAX_PATH];__int64     nTotalSize;         // 该任务总大小(字节)__int64     nTotalDownload;     // 下载有效字节数(可能存在回退的情况)float		fPercent;           // 下载进度int			nReserved0;int			nSrcTotal;          // 总资源数int			nSrcUsing;          // 可用资源数int			nReserved1;int			nReserved2;int			nReserved3;int			nReserved4;__int64     nReserved5;__int64		nDonationP2P;       // p2p贡献字节数__int64		nReserved6;__int64		nDonationOrgin;		// 原始资源共享字节数__int64		nDonationP2S;		// 镜像资源共享字节数__int64		nReserved7;__int64     nReserved8;int			nSpeed;             // 即时速度(字节/秒)int			nSpeedP2S;          // 即时速度(字节/秒)int			nSpeedP2P;          // 即时速度(字节/秒)bool		bIsOriginUsable;    // 原始资源是否有效float		fHashPercent;       // 现不提供该值int			IsCreatingFile;     // 是否正在创建文件DWORD		reserved[64];
};
enum DOWN_PROXY_TYPE
{PROXY_TYPE_IE	 = 0,PROXY_TYPE_HTTP  = 1,PROXY_TYPE_SOCK4 = 2,PROXY_TYPE_SOCK5 = 3,PROXY_TYPE_FTP   = 4,PROXY_TYPE_UNKOWN  = 255,
};
enum DOWN_PROXY_AUTH_TYPE
{PROXY_AUTH_NONE =0,PROXY_AUTH_AUTO,PROXY_AUTH_BASE64,PROXY_AUTH_NTLM,PROXY_AUTH_DEGEST,PROXY_AUTH_UNKOWN,
};
struct DOWN_PROXY_INFO
{BOOL		bIEProxy;BOOL		bProxy;DOWN_PROXY_TYPE	stPType;DOWN_PROXY_AUTH_TYPE	stAType;wchar_t		szHost[2048];INT32		nPort;wchar_t		szUser[50];wchar_t		szPwd[50];wchar_t		szDomain[2048];
};
struct WSAPROTOCOL_INFOW;#pragma pack(pop)namespace DownEngine
{extern "C" __declspec(dllimport) BOOL   XL_Init(void);extern "C" __declspec(dllimport) BOOL   XL_UnInit(void);extern "C" __declspec(dllimport) HANDLE XL_CreateTask(DownTaskParam &stParam);extern "C" __declspec(dllimport) BOOL   XL_DeleteTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL   XL_StartTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL   XL_StopTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL   XL_ForceStopTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL   XL_QueryTaskInfo(HANDLE hTask, DownTaskInfo & stTaskInfo); //旧版接口,使用Ex接口替换extern "C" __declspec(dllimport) BOOL   XL_QueryTaskInfoEx(HANDLE hTask, DownTaskInfo & stTaskInfo);extern "C" __declspec(dllimport) BOOL	XL_DelTempFile(DownTaskParam &stParam);extern "C" __declspec(dllimport) void	XL_SetSpeedLimit(INT32 nKBps);extern "C" __declspec(dllimport) void	XL_SetUploadSpeedLimit(INT32 nTcpKBps,INT32 nOtherKBps);extern "C" __declspec(dllimport) BOOL	XL_SetProxy(DOWN_PROXY_INFO &stProxyInfo);extern "C" __declspec(dllimport) void   XL_SetUserAgent(const wchar_t *pszUserAgent);extern "C" __declspec(dllimport) BOOL   XL_ParseThunderPrivateUrl(const wchar_t *pszThunderUrl, wchar_t *normalUrlBuffer, INT32 bufferLen);extern "C" __declspec(dllimport) BOOL   XL_GetFileSizeWithUrl(const wchar_t * lpURL, INT64& iFileSize);extern "C" __declspec(dllimport) BOOL   XL_SetFileIdAndSize(HANDLE hTask, char szFileId[40], unsigned __int64 nFileSize);extern "C" __declspec(dllimport) BOOL   XL_SetAdditionInfo( HANDLE task_id, WSAPROTOCOL_INFOW *sock_info, CHAR *http_resp_buf, LONG buf_len );extern "C" __declspec(dllimport) HANDLE XL_CreateTaskByURL(const wchar_t *url, const wchar_t *path, const wchar_t *fileName, BOOL IsResume);extern "C" __declspec(dllimport) LONG   XL_CreateTaskByThunder(wchar_t *pszUrl, wchar_t *pszFileName, wchar_t *pszReferUrl, wchar_t *pszCharSet, wchar_t *pszCookie);extern "C" __declspec(dllimport) LONG   XL_CreateBTTaskByThunder(const wchar_t *pszPath);
};

相关函数的具体说明,可以参考Github上的文档
这一版本没有调用的示例,但是没关系,liebao_Thunder_Cloud这一版本有调用示例;
在这里插入图片描述
参考thunderWrapper.h文件中的thunderWrapper类通过
LoadLibraryGetProcAddress函数调用,使用MSCV2017编译器
并添加<Windows.h>引用,建议添加:

#include <Windows.h>
#include <stdio.h>
#include <Shlwapi.h>
#pragma comment(lib,"Shlwapi")
  • 初始化函数示例:

只需要简单修改init方法,修改xldl.dll的加载路径,其他基本不变;

bool init(PCWSTR pDllPath = L"xldl.dll")
{assert(!m_hModule);WCHAR szModulePath[MAX_PATH] = { 0 };GetModuleFileNameW(NULL, szModulePath, MAX_PATH);PathRemoveFileSpecW(szModulePath);  // 拆分路径        新版使用PathCchRemoveFileSpecqDebug()<<"[szModulePath] "<<QString::fromWCharArray(szModulePath);WCHAR szDllpath[MAX_PATH] = { 0 };PathCombineW(szDllpath, szModulePath, L"xldl.dll");  // 连接路径, 新版建议使用 PathCchCombineqDebug()<<"[szDllpath] "<<QString::fromWCharArray(szDllpath);m_hModule = LoadLibraryW(szDllpath);assert(m_hModule);if (m_hModule == NULL){qDebug()<<"can not load xldl.dll -->";throw L"can not load xldl.dll";}_Init					= (fn_Init)						GetProcAddress(m_hModule, "XL_Init");_UnInit					= (fn_UnInit)					GetProcAddress(m_hModule, "XL_UnInit");_TaskCreate				= (fn_TaskCreate)				GetProcAddress(m_hModule, "XL_CreateTask");_TaskDelete				= (fn_TaskDelete)				GetProcAddress(m_hModule, "XL_DeleteTask");_TaskStart				= (fn_TaskStart)				GetProcAddress(m_hModule, "XL_StartTask");_TaskPause				= (fn_StopTask)				    GetProcAddress(m_hModule, "XL_StopTask");_TaskForcePause         = (fn_StopTask)				    GetProcAddress(m_hModule, "XL_ForceStopTask");_TaskQuery				= (fn_TaskQuery)				GetProcAddress(m_hModule, "XL_QueryTaskInfo");_TaskQueryEx			= (fn_TaskQueryEx)				GetProcAddress(m_hModule, "XL_QueryTaskInfoEx");_LimitSpeed				= (fn_LimitSpeed)				GetProcAddress(m_hModule, "XL_SetSpeedLimit");_LimitUploadSpeed		= (fn_LimitUploadSpeed)			GetProcAddress(m_hModule, "XL_SetUploadSpeedLimit");_DelTempFile			= (fn_DelTempFile)				GetProcAddress(m_hModule, "XL_DelTempFile");_SetProxy				= (fn_SetProxy)                 GetProcAddress(m_hModule, "XL_SetProxy");_SetUserAgent			= (fn_SetUserAgent)				GetProcAddress(m_hModule, "XL_SetUserAgent");_GetFileSizeWithUrl		= (fn_GetFileSizeWithUrl)		GetProcAddress(m_hModule, "XL_GetFileSizeWithUrl");_ParseThunderPrivateUrl = (fn_ParseThunderPrivateUrl)	GetProcAddress(m_hModule, "XL_ParseThunderPrivateUrl");_SetAdditionInfo		= (fn_SetAdditionInfo)			GetProcAddress(m_hModule, "XL_SetAdditionInfo");_SetFileIdAndSize		= (fn_SetFileIdAndSize)			GetProcAddress(m_hModule, "XL_SetFileIdAndSize");_CreateTaskByURL        = (fn_CreateTaskByURL)			GetProcAddress(m_hModule, "XL_CreateTaskByURL");_CreateTaskByThunder    = (fn_CreateTaskByThunder)		GetProcAddress(m_hModule, "XL_CreateTaskByThunder");_CreateBTTaskByThunder  = (fn_CreateBTTaskByThunder)	GetProcAddress(m_hModule, "XL_CreateBTTaskByThunder");CHECKFUNC(_Init, false);return _Init() == TRUE;
}

需要注意的是在不同版本中,所包含的方法函数也不一样,例如liebao_Thunder_Cloud 版就没有XL_CreateTaskByURL函数方法,

  • 实际线程调用:

继承QThread类,重写void run() override;方法,获取文件总大小,下载进度,下载有效字节数,即时速度,倒计时等信息,并通过信号槽控制下载的中断和退出。

void QThread_ThunderWrapper::run()
{emit IsStart(true);bool ISuccessed=false;IsQuit=false;QString Error="";try {qDebug()<<"QThread_ThunderWrapper Start!";thunderWrapper=new Lib_ThunderWrapper();bool ISuccessed=thunderWrapper->init();if(!ISuccessed)throw QString("Lib_ThunderWrapper 初始化失败!");elseqDebug()<<"thunderWrapper->init : Successed!";wchar_t * url=utf8_to_wchar(Urlpath.toStdString().c_str());wchar_t * path=utf8_to_wchar(Filepath.toStdString().c_str());wchar_t * fileName=utf8_to_wchar(Filename.toStdString().c_str());if(!thunderWrapper->CreateTaskByURL(url,path,fileName,TRUE)){thunderWrapper->unInit();throw QString("taskCreate 失败!");}elseqDebug()<<"thunderWrapper->taskCreate : Successed!";if(!thunderWrapper->taskStart()){thunderWrapper->taskDelete();thunderWrapper->unInit();throw QString("taskStart 失败!");}elseqDebug()<<"thunderWrapper->taskStart : Successed!";//! 1秒查询一次msleep(1000);DownTaskInfo stTaskInfo;while (!IsQuit) {if(thunderWrapper->taskQueryEx(stTaskInfo)){if(stTaskInfo.stat==TSC_ERROR){emit Current_status("下载失败!",TSC_ERROR);throw QString("TSC_ERROR: fail_code:%1").arg(stTaskInfo.fail_code);}else if(stTaskInfo.stat==TSC_PAUSE){emit Current_status("下载暂停!",TSC_PAUSE);}else if(stTaskInfo.stat==TSC_DOWNLOAD){emit Current_status("正在下载...",TSC_PAUSE);emit Down_Speed(stTaskInfo.nSpeed);emit ProgressBar((int)stTaskInfo.fPercent*100);emit SendDownsize(stTaskInfo.nTotalDownload,stTaskInfo.nTotalSize);if(stTaskInfo.nSpeed>0)emit Time_Remaining((stTaskInfo.nTotalSize-stTaskInfo.nTotalDownload)/stTaskInfo.nSpeed);}else if(stTaskInfo.stat==TSC_COMPLETE){ISuccessed=true;IsQuit=true;emit Current_status("下载完成",TSC_COMPLETE);emit Down_Speed(stTaskInfo.nSpeed);emit ProgressBar((int)stTaskInfo.fPercent*100);emit SendDownsize(stTaskInfo.nTotalDownload,stTaskInfo.nTotalSize);emit Time_Remaining(0);break;}else if(stTaskInfo.stat==TSC_STARTPENDING){emit Current_status("等待下载!",TSC_STARTPENDING);}else if(stTaskInfo.stat==TSC_STOPPENDING){emit Current_status("停止等待!",TSC_STARTPENDING);}
//                qDebug().noquote()<<QString("\n state              : %1 "
//                                            "\n fail_code          : %2"
//                                            "\n nTotalSize         : %3"
//                                            "\n nTotalDownload     : %4"
//                                            "\n fPercent           : %5"
//                                            "\n nSrcTotal          : %6"
//                                            "\n nSrcUsing          : %7"
//                                            "\n nSpeed             : %8"
//                                            "\n szFilename         : %9"
//                                            "\n szSavePath         : %10"
//                                            "\n IsCreatingFile     : %11"
//                                            "\n bIsOriginUsable    : %12 \n\n")
//                                     .arg(stateStr)
//                                     .arg(stTaskInfo.fail_code)
//                                     .arg(QString::number(stTaskInfo.nTotalSize,10))
//                                     .arg(QString::number(stTaskInfo.nTotalDownload,10))
//                                     .arg(QString::number(stTaskInfo.fPercent))
//                                     .arg(stTaskInfo.nSrcTotal)
//                                     .arg(stTaskInfo.nSrcUsing)
//                                     .arg(stTaskInfo.nSpeed)
//                                     .arg(QString::fromWCharArray(stTaskInfo.szFilename))
//                                     .arg(QString::fromWCharArray(stTaskInfo.szReserved0))
//                                     .arg(stTaskInfo.IsCreatingFile?"TRUE":"FALSE")
//                                     .arg(stTaskInfo.bIsOriginUsable?"TRUE":"FALSE")
//                                    ;//! 1秒查询一次}msleep(1000);}}catch (QString error) {ISuccessed=false;Error="异常信息 :"+error;}catch (...) {}qDebug()<<"thunderWrapper unInit-->";thunderWrapper->unInit();//! 清除连接delete thunderWrapper;thunderWrapper=nullptr;emit IsStart(true);
}

如图所示:
下载在网上找到系统镜像文件时,ThunderOpenSDK下载速度更快, 能稳定到9mb/s左右,而通过原生的QNetworkReply下载最高在5Mb/s左右。
请添加图片描述


ThunderOpenSDK 下载问题

ThunderOpenSDK 无法下载包含重定向跳转的下载链接,
正当我打算整体改用ThunderOpenSDK下载时,我突然发现ThunderOpenSDK 无法下载项目中的资源文件,换成其他网上找的资源文件又能正常下载,
测试多次发现ThunderOpenSDK只能下载直接指向下载资源的链接,
包含重定向跳转的下载链接下载不了!
无解,果断放弃,还是改用调用Aria2下载!
不过一般的下载ThunderOpenSDK库也完全够用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/459625.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八,Linux基础环境搭建(CentOS7)- 安装Mysql和Hive

Linux基础环境搭建&#xff08;CentOS7&#xff09;- 安装Mysql和Hive 大家注意以下的环境搭建版本号&#xff0c;如果版本不匹配有可能出现问题&#xff01; 一、Mysql下载及安装 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Orac…

等保测评:塑造信息时代的新常态

随着信息技术的飞速发展&#xff0c;信息安全已经成为一个全球性的问题。在信息时代&#xff0c;数据的安全性、完整性和可用性对于个人、企业乃至国家都至关重要。等保测评&#xff08;等级保护测评&#xff09;&#xff0c;作为信息安全领域的一项重要工作&#xff0c;其目的…

C++ 整型大数运算(大整数运算)项目

C 整型大数运算项目 一、项目介绍二、项目变量成员三、项目实现构造函数加法减法乘法先计算再进位边计算边进位 除法与取模判断输入输出 四、项目源代码展示在 Big_integer.h 中&#xff1a;在 Big_integer.cpp 中&#xff1a; 五、测试准确性六、优化方向 一、项目介绍 整型大…

C++,STL 051(24.10.28)

内容 1.map容器的构造函数。 2.map容器的赋值操作。 运行代码 #include <iostream> #include <map>using namespace std;void printMap(map<int, int> &m) {for (map<int, int>::iterator it m.begin(); it ! m.end(); it){cout << &quo…

JavaSE笔记2】面向对象

目录 一、深刻认识面向对象 二、对象在计算机中的执行原理 三、this 四、构造器 五、封装 六、实体Javabean(实体类) 1. 是什么&#xff1f; 2. 实体类用来干什么&#xff1f; 七、成员变量和局部变量的区别 一、深刻认识面向对象 二、对象在计算机中的执行原理 三、this Java中…

通俗直观介绍ChatGPT背后的大语言模型理论知识

“AI 的 iPhone 时刻到来了”。非算法岗位的研发同学’被迫’学习 AI&#xff0c;产品岗位的同学希望了解 AI。但是&#xff0c;很多自媒体文章要么太严谨、科学&#xff0c;让非科班出身的同学读不懂&#xff1b;要么&#xff0c;写成了科幻文章&#xff0c;很多结论都没有充分…

基于SpringBoot的“时间管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“时间管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 管理员功能界面图 系统管理界面图…

云计算平台上的DevOps实践

文章目录 什么是DevOps云计算平台上的DevOps优势自动化部署弹性伸缩地理分布 实施DevOps的关键组件版本控制系统持续集成/持续交付工具配置管理工具监控和日志管理 实践案例使用AWS CodePipeline进行持续集成/持续交付利用AWS Auto Scaling实现弹性使用AWS CloudFormation进行基…

嵌入式学习-网络-Day03

嵌入式学习-网络-Day03 1.linux下IO模型及特点 1.1阻塞式IO 1.2非阻塞式IO 设置非阻塞&#xff1a; 1&#xff09;通过函数参数设置 2&#xff09;通过fcntl函数设置文件描述符属性 1.3信号驱动IO&#xff08;异步IO&#xff09; 1.4IO多路复用&#xff08;重点&#xff09; IO…

【HarmonyOS】判断应用是否已安装

【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全&#xff0c;只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法&#xff0c;即&#xff1a;canOpenLink。 使用该工具函数的前提是&#xff0c;本应用配置了查询标签querySch…

【AI模特试衣整合包及教程】CatVTON引领虚拟试衣新时代

在这个数字时代&#xff0c;科技与时尚的融合日益紧密&#xff0c;为我们的生活带来前所未有的便利。今天&#xff0c;我们为您介绍一款革命性的虚拟试衣技术——CatVTON。它不仅为电商平台带来了全新的用户体验&#xff0c;更为设计师和消费者提供了无限创意的可能性。 一、Ca…

深度学习Pytorch-Tensor的属性、算术运算

深度学习Pytorch-Tensor的属性、算术运算 Tensor的属性Tensor的算术运算Pytorch中的in-place操作Pytorch中的广播机制Tensor的取整/取余运算Tensor的比较运算Tensor的取前k个大/前k小/第k小的数值及其索引Tensor判定是否为finite/inf/nan Tensor的属性 每一个Tensor对象都有以…

【强化学习】Actor-Critic算法

最近读论文看到了强化学习中的Actor-Critic算法。因此了解一下这方面的知识&#xff0c;并记录下来&#xff0c;以防忘记。文章中部分内容也借鉴了其他优秀的博主。 文章目录 一、简介二、策略梯度法&#xff08;Policy Gradient&#xff09;三、Q-Learning四、Actor-Critic 算…

【c语言】运算符汇总(万字解析)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 前言 一、c语言运算符的分类 二、各运算符的功能及使用 1. 算数运算符 - * / % 2. 位运算符 二进制和进制转换 二进制转十进制 十进制…

【Spring】Cookie与Session

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 一、Cookie是什么&#xff1f; Cookie的存在主要是为了解决HTTP协议的无状态性问题&#xff0c;即协议本身无法记住用户之前的操作。 "⽆状态" 的含义指的是: 默认情况…

c++习题36-奇数单增序列

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 给定一个长度为N&#xff08;不大于500&#xff09;的正整数序列&#xff0c;请将其中的所有奇数取出&#xff0c;并按升序输出。 输入描述 第1行为 N&#xff1b; 第2行为 N 个正整…

java中Scanner的nextLine和next方法

思考&#xff0c;输入1 2 3 4 5加上enter&#xff0c;输出什么 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int[][] m new int[2][2];for (int i 0; i < 2; i) {for (int j 0; j < 2;…

Spring Boot技术中小企业设备管理系统设计与实践

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

重学SpringBoot3-怎样优雅停机

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-怎样优雅停机 1. 什么是优雅停机&#xff1f;2. Spring Boot 3 优雅停机的配置3. Tomcat 和 Reactor Netty 的优雅停机机制3.1 Tomcat 优雅停机3.2 Reac…

使用 Kafka 和 MinIO 实现人工智能数据工作流

MinIO Enterprise Object Store 是用于创建和执行复杂数据工作流的基础组件。此事件驱动功能的核心是使用 Kafka 的 MinIO 存储桶通知。MinIO Enterprise Object Store 为所有 HTTP 请求&#xff08;如 PUT、POST、COPY、DELETE、GET、HEAD 和 CompleteMultipartUpload&#xf…