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

【C++】POCO学习总结(十):Poco::Util::Application(应用程序框架)

【C++】郭老二博文之:C++目录

1、Poco::Util::Application 应用框架

1.1 应用程序基本功能

Poco::Util::Application是POCO实现的的应用程序框架,支持功能如下:

  • 命令行参数处理
  • 配置文件
  • 初始化和关机
  • 日志

1.2 命令行程序和守护进程

POCO支持两种应用:

  • 命令行应用程序:从命令行启动,POCO支持命令行参数处理
  • 服务器应用程序:通常作为守护进程运行,比如Linux守护进程、Windows服务

2、Poco::Util::Subsystem 子系统

2.1 说明

Poco::Util::Application继承自Poco::Util::Subsystem。
POCO中将不同的子系统组成一个应用程序。子系统以模块化的方式扩展应用。

  • 子系统抽象出统一的初始化和关闭等步骤。
  • 当一个应用程序被初始化时,它所有注册的子系统也被初始化。
  • 当一个应用程序关闭时,它所有注册的子系统也会关闭。

2.2 使用

一个子系统都是从Poco::Util::Subsystem继承而来,下面列出几个常用的接口

  • const char* name():返回子系统的名称;
  • void initialize(Application& app):初始化子系统操作;
  • void uninitialize(Application& app):关闭子系统时的操作;
  • void reinitialize(Application& app):重新配置子系统(可选;默认实现调用uninitialize(),然后调用initialize());
  • void defineOptions(OptionSet& options):子系统自定义命令行参数

3、命令行程序

命令行应用程序是通过创建Poco::Util::Application的子类来实现的。有几个虚成员函数需要重写:

  • void initialize(Application& self)
  • void reinitialize()
  • void uninitialize()
  • void defineOptions()
  • int main(std::vectorstd::string& args)

注意:上面的main是Poco::Util::Application的成员函数,应用程序的主要逻辑写在这里。
返回值是枚举:ExitCode

enum ExitCode
{EXIT_OK          = 0,   成功终止EXIT_USAGE	     = 64,  命令行使用错误EXIT_DATAERR     = 65,  数据格式错误EXIT_NOINPUT     = 66,  无法打开输入EXIT_NOUSER      = 67,  地址错误EXIT_NOHOST      = 68,  主机名是未知EXIT_UNAVAILABLE = 69,  服务不可用EXIT_SOFTWARE    = 70,  内部软件错误EXIT_OSERR	     = 71,  系统错误 (e.g., can't fork)EXIT_OSFILE      = 72,  关键操作系统文件丢失EXIT_CANTCREAT   = 73,  不能创建(用户)输出文件EXIT_IOERR       = 74,  输入/输出错误EXIT_TEMPFAIL    = 75,  临时错误,可以尝试重新运行EXIT_PROTOCOL    = 76,  协议中的远程错误EXIT_NOPERM      = 77,  没有权限EXIT_CONFIG      = 78   配置错误
};

4、Poco::Util::ServerApplication 服务类程序

想要实现一个服务类程序,需要从Poco::Util::ServerApplication继承;
Poco::Util::ServerApplication本身继承自Poco::Util::Application;

服务类应用程序可以从命令行运行,比如:Linux守护进程、Windows服务。
通常,服务类应用程序在后台线程中工作。因此,main()成员函数将启动线程,然后等待外部请求来终止应用程序(参见waitForTerminationRequest())。

5、配置文件

5.1 说明

默认情况下会创建两个配置:

  • 可写的MapConfiguration,只读的PRIO_APPLICATION
  • SystemConfiguration, PRIO_SYSTEM

5.2 用法

void MyApplication::initialize(Application& self)
{loadConfiguration(); // 加载默认配置文件Application::initialize(self);
}

6、命令行参数

6.1 说明

应用程序可以定义和处理命令行参数(选项)。命令行参数格式随系统不同而不同:

  • Windows:/option or /option=value
  • Linux:-o, -ovalue, --option or --option:value

6.2 使用

应用程序的选项通过重写虚函数 void defineOptions(OptionSet& options) 来实现
“定义选项类”OptionSet 用来处理选项,比如OptionSet::addOption()函数可以添加选项,示例如下:

void defineOptions(OptionSet& options)
{Application::defineOptions(options);options.addOption(Option("help", "h", "display help information on command line arguments").required(false).repeatable(false).callback(OptionCallback<SampleApp>(this, &SampleApp::handleHelp)));options.addOption(Option("config-file", "f", "load configuration data from a file").required(false).repeatable(true).argument("file").callback(OptionCallback<SampleApp>(this, &SampleApp::handleConfig)));options.addOption(Option("bind", "b", "bind option value to test.property").required(false).argument("value").validator(new IntValidator(0, 100)).binding("test.property"));
}

运行时打印:

-h, --help display help 	information on command line arguments
-ffile, --config-file=file 	load configuration data from a file
-bvalue, --bind=value bind 	option value to test.property

每个选项Option有如下内容:

  • 一个全名
  • 一个用字符表示的缩写(短名字)
  • 一段描述
  • 一个参数名:argument
  • 是否必须:required
  • 是否可重复:repeatable,它可以在命令行中被多次给出
  • 回调函数:callback

6.3 验证选项参数

通过为选项指定一个Validator对象,可以自动验证选项参数。

  • IntValidator 检查参数是否为一定范围内的整数。
  • RegExpValidator 验证参数是否匹配给定的正则表达式。

比如上例中的:.validator(new IntValidator(0, 100))

6.4 显示帮助信息

Poco::Util::HelpFormatter类可用于显示命令行选项帮助信息。
当用户请求帮助信息时,应取消所有进一步的命令行处理(特别是强制执行所需选项)。这可以通过调用stopOptionsProcessing()来完成。

void displayHelp()
{HelpFormatter helpFormatter(options());helpFormatter.setCommand(commandName());helpFormatter.setUsage("OPTIONS");helpFormatter.setHeader("Poco::Util::Application类的示例");helpFormatter.format(std::cout);
}void handleHelp(const std::string& name, const std::string& value)
{_helpRequested = true;displayHelp();stopOptionsProcessing();
}

7、Windows 服务

Windows服务需要注册。
Poco::Util::ServerApplication可以实现注册的步骤。

  • 注册:在命令行启动时指定选项 /registerService
  • 取消注册:指定 /unregisterService 选项来取消
  • 设置服务名称:通过选项 /displayName 来指定

8、Linux 守护进程

在Linux平台上,继承Poco::Util::ServerApplication后,可以通过命令行参数“–daemon”来实现,作为守护进程运行。
一个守护进程,当启动时,会立即从执行实际工作的后台进程中分离出来。启动后台进程后,前台进程退出。
初始化完成后,在进入main()方法之前,守护进程的当前工作目录将更改为根目录(“/”),这是守护进程的常见做法。

应用程序可以通过检查application.runasdaemon配置属性来确定它是否作为守护进程运行。
与Windows服务一样,在配置文件中使用相对路径时要小心,因为守护进程的当前工作目录是根目录。

#include "Poco/Util/ServerApplication.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include "Poco/Task.h"
#include "Poco/TaskManager.h"
#include "Poco/DateTimeFormatter.h"
#include <iostream>using Poco::Util::Application;
using Poco::Util::ServerApplication;
using Poco::Util::Option;
using Poco::Util::OptionSet;
using Poco::Util::OptionCallback;
using Poco::Util::HelpFormatter;
using Poco::Task;
using Poco::TaskManager;
using Poco::DateTimeFormatter;class SampleTask: public Task
{
public:SampleTask(): Task("SampleTask"){}void runTask(){Application& app = Application::instance();while (!sleep(5000)){Application::instance().logger().information("busy doing nothing... " + DateTimeFormatter::format(app.uptime()));}}
};class SampleServer: public ServerApplication
{
public:SampleServer(): _helpRequested(false){}~SampleServer(){}protected:void initialize(Application& self){loadConfiguration(); // load default configuration files, if presentServerApplication::initialize(self);logger().information("starting up");}void uninitialize(){logger().information("shutting down");ServerApplication::uninitialize();}void defineOptions(OptionSet& options){ServerApplication::defineOptions(options);options.addOption(Option("help", "h", "display help information on command line arguments").required(false).repeatable(false).callback(OptionCallback<SampleServer>(this, &SampleServer::handleHelp)));}void handleHelp(const std::string& name, const std::string& value){_helpRequested = true;displayHelp();stopOptionsProcessing();}void displayHelp(){HelpFormatter helpFormatter(options());helpFormatter.setCommand(commandName());helpFormatter.setUsage("OPTIONS");helpFormatter.setHeader("A sample server application that demonstrates some of the features of the Util::ServerApplication class.");helpFormatter.format(std::cout);}int main(const ArgVec& args){if (!_helpRequested){TaskManager tm;tm.start(new SampleTask);waitForTerminationRequest();tm.cancelAll();tm.joinAll();}return Application::EXIT_OK;}
private:bool _helpRequested;
};POCO_SERVER_MAIN(SampleServer)

9、一个简单的示例

#include "Poco/Util/Application.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include "Poco/Util/AbstractConfiguration.h"
#include "Poco/AutoPtr.h"
#include <iostream>
#include <sstream>using Poco::Util::Application;
using Poco::Util::Option;
using Poco::Util::OptionSet;
using Poco::Util::HelpFormatter;
using Poco::Util::AbstractConfiguration;
using Poco::Util::OptionCallback;
using Poco::AutoPtr;class SampleApp: public Application/// This sample demonstrates some of the features of the Util::Application class,/// such as configuration file handling and command line arguments processing.////// Try SampleApp --help (on Unix platforms) or SampleApp /help (elsewhere) for/// more information.
{
public:SampleApp(): _helpRequested(false){}protected:void initialize(Application& self){loadConfiguration(); // load default configuration files, if presentApplication::initialize(self);// add your own initialization code here}void uninitialize(){// add your own uninitialization code hereApplication::uninitialize();}void reinitialize(Application& self){Application::reinitialize(self);// add your own reinitialization code here}void defineOptions(OptionSet& options){Application::defineOptions(options);options.addOption(Option("help", "h", "display help information on command line arguments").required(false).repeatable(false).callback(OptionCallback<SampleApp>(this, &SampleApp::handleHelp)));options.addOption(Option("define", "D", "define a configuration property").required(false).repeatable(true).argument("name=value").callback(OptionCallback<SampleApp>(this, &SampleApp::handleDefine)));options.addOption(Option("config-file", "f", "load configuration data from a file").required(false).repeatable(true).argument("file").callback(OptionCallback<SampleApp>(this, &SampleApp::handleConfig)));options.addOption(Option("bind", "b", "bind option value to test.property").required(false).repeatable(false).argument("value").binding("test.property"));}void handleHelp(const std::string& name, const std::string& value){_helpRequested = true;displayHelp();stopOptionsProcessing();}void handleDefine(const std::string& name, const std::string& value){defineProperty(value);}void handleConfig(const std::string& name, const std::string& value){loadConfiguration(value);}void displayHelp(){HelpFormatter helpFormatter(options());helpFormatter.setCommand(commandName());helpFormatter.setUsage("OPTIONS");helpFormatter.setHeader("A sample application that demonstrates some of the features of the Poco::Util::Application class.");helpFormatter.format(std::cout);}void defineProperty(const std::string& def){std::string name;std::string value;std::string::size_type pos = def.find('=');if (pos != std::string::npos){name.assign(def, 0, pos);value.assign(def, pos + 1, def.length() - pos);}else name = def;config().setString(name, value);}int main(const ArgVec& args){if (!_helpRequested){logger().information("Command line:");std::ostringstream ostr;for (ArgVec::const_iterator it = argv().begin(); it != argv().end(); ++it){ostr << *it << ' ';}logger().information(ostr.str());logger().information("Arguments to main():");for (ArgVec::const_iterator it = args.begin(); it != args.end(); ++it){logger().information(*it);}logger().information("Application properties:");printProperties("");}return Application::EXIT_OK;}void printProperties(const std::string& base){AbstractConfiguration::Keys keys;config().keys(base, keys);if (keys.empty()){if (config().hasProperty(base)){std::string msg;msg.append(base);msg.append(" = ");msg.append(config().getString(base));logger().information(msg);}}else{for (AbstractConfiguration::Keys::const_iterator it = keys.begin(); it != keys.end(); ++it){std::string fullKey = base;if (!fullKey.empty()) fullKey += '.';fullKey.append(*it);printProperties(fullKey);}}}private:bool _helpRequested;
};

打印帮助信息

$ ./SampleApp -h
usage: SampleApp OPTIONS
A sample application that demonstrates some of the features of the Poco::Util::Application class.-h, --help                         display help information on command line arguments
-Dname=value, --define=name=value  define a configuration property
-ffile, --config-file=file         load configuration data from a file
-bvalue, --bind=value              bind option value to test.property

运行后的打印信息

$ ./SampleApp
[Information] Command line:
[Information] ./SampleApp 
[Information] Arguments to main():
[Information] Application properties:
[Information] application.argc = 1
[Information] application.argv[0] = ./SampleApp
[Information] application.baseName = SampleApp
[Information] application.cacheDir = /home/laoer/.cache/SampleApp/
[Information] application.configDir = /home/laoer/git/poco/Util/samples/SampleApp/
[Information] application.dataDir = /home/laoer/.local/share/SampleApp/
[Information] application.dir = /home/laoer/git/poco/Util/samples/SampleApp/bin/Linux/x86_64/
[Information] application.name = SampleApp
[Information] application.path = /home/laoer/git/poco/Util/samples/SampleApp/bin/Linux/x86_64/SampleApp
[Information] application.tempDir = /home/laoer/.local/tmp/SampleApp/
[Information] logging.channels.c1.class = ConsoleChannel
[Information] logging.channels.c1.formatter = f1
[Information] logging.formatters.f1.class = PatternFormatter
[Information] logging.formatters.f1.pattern = [%p] %t
[Information] logging.loggers.app.channel = c1
[Information] logging.loggers.app.name = Application
[Information] logging.loggers.root.channel.class = ConsoleChannel
[Information] system.osName = Linux
[Information] system.osVersion = 6.2.0-37-generic
[Information] system.osArchitecture = x86_64
[Information] system.nodeName = laoer
[Information] system.nodeId = 
[Information] system.currentDir = /home/laoer/git/poco/Util/samples/SampleApp/bin/Linux/x86_64/
[Information] system.homeDir = /home/laoer/
[Information] system.configHomeDir = /home/laoer/.config/
[Information] system.cacheHomeDir = /home/laoer/.cache/
[Information] system.dataHomeDir = /home/laoer/.local/share/
[Information] system.tempHomeDir = /home/laoer/.local/tmp/
[Information] system.tempDir = /tmp/
[Information] system.configDir = /etc/
[Information] system.dateTime = 2023-12-10T14:50:02Z
[Information] system.pid = 4919

相关文章:

【C++】POCO学习总结(十):Poco::Util::Application(应用程序框架)

【C】郭老二博文之&#xff1a;C目录 1、Poco::Util::Application 应用框架 1.1 应用程序基本功能 Poco::Util::Application是POCO实现的的应用程序框架&#xff0c;支持功能如下&#xff1a; 命令行参数处理配置文件初始化和关机日志 1.2 命令行程序和守护进程 POCO支持…...

探索医学影像:如何通过ROI灰度直方图和ROI区域方格图揭示隐秘细节?

一、引言 医学影像是现代医学诊断的重要手段&#xff0c;其中nrrd文件格式作为一种常见的医学影像数据存储方式&#xff0c;被广泛应用于各种医学影像设备和软件中。这种文件格式具有丰富的元数据信息&#xff0c;可以精确记录影像的空间位置、方向和尺度等信息&#xff0c;对于…...

SASS基本语法总结

SASS是CSS预处理器&#xff0c;简单来说&#xff0c;SASS是比CSS更高一级的语言&#xff0c;它拥有CSS不具备的语法&#xff0c;比如if条件控制 SASS的预处理器 SASS是一种无法被浏览器直接执行的语言&#xff0c;我们需要通过预处理工具&#xff08;可以理解为翻译工具&…...

【C++】简单工厂模式

2023年12月6日&#xff0c;周三下午 今天又学习了一次简单工厂模式 每多学习一次&#xff0c;都会加深对设计模式的理解 目录 什么是简单工厂模式简单工厂模式的优缺点举例说明 什么是简单工厂模式 简单工厂模式&#xff08;Simple Factory Pattern&#xff09;是一种创建型…...

el-tree数据量过大,造成浏览器卡死、崩溃

el-tree数据量过大&#xff0c;造成浏览器卡死、崩溃 场景&#xff1a;树形结构展示&#xff0c;数据超级多&#xff0c;超过万条&#xff0c;每次打开都会崩溃 我这里采用的是引入新的插件虚拟树&#xff0c;它是参照element-plus 中TreeV2改造vue2.x版本虚拟化树形控件&…...

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 目录 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 需要环境或者解析可以私信 &#xff08;二&#xff09;A 模块基础设施设置/安全加固&#xff08;200 分&…...

面向LLM的App架构——业务维度

这是两篇面向LLM的大前端架构的第一篇&#xff0c;主要写我对LLM业务的认知以及由此推演出的大前端架构。由于我是客户端出身&#xff0c;所以主要以客户端角度来描述&#xff0c;并不影响对前端的适用性。 对LLM的认知 基于Google对AGI的论文&#xff0c;AGI或者LLM一定会朝…...

ElasticSearch之cat plugins API

命令样例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/plugins?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"执行结果输出如下&#xff1a; name component version…...

【小米电脑管家】安装使用教程--非小米电脑

安装说明功能体验下载资源 Xiaomi HyperOS发布后&#xff0c;小米妙享电脑端独立版本也走向终点&#xff0c;最新的【小米电脑管家】将会内置妙享实现万物互联。那么本篇文章将分享非小米电脑用户如何绕过设备识别验证安装使用【小米电脑管家】实现万物互联 安装说明 1.解压文…...

视频讲解|基于多目标粒子群算法的配电网储能选址定容

1 主要内容 该视频为3012基于多目标粒子群算法的配电网储能选址定容matlab代码讲解内容&#xff0c;对应的资源下载链接为基于多目标粒子群算法的配电网储能选址定容&#xff0c;程序主要内容是&#xff1a;以系统节点电压水平&#xff08;电网脆弱性&#xff09;、网络损耗以…...

Android 13 - Media框架(22)- MediaCodec(三)

这一节开始我们将重新回到 MediaCodec 这一层来学习 buffer 的流转 status_t MediaCodec::dequeueOutputBuffer(size_t *index,size_t *offset,size_t *size,int64_t *presentationTimeUs,uint32_t *flags,int64_t timeoutUs) {sp<AMessage> msg new AMessage(kWhatDequ…...

git提交报错 fatal: LF would be replaced by CRLF in package-lock.json

报错 fatal: LF would be replaced by CRLF in package-lock.json 原因 git 在windows下&#xff0c;默认是CRLF作为换行符&#xff0c; git add 提交时&#xff0c;会检查文本中是否有LF 换行符&#xff08;linux系统&#xff09;&#xff0c;如果有则会告警&#xff0c; 所…...

卷积详解和并行卷积

ps&#xff1a;在 TensorFlow Keras 中&#xff0c;构建 Sequential 模型的正确方式是将层作为列表传递&#xff0c;而不是作为一系列单独的参数。 modelmodels.Sequential([layers&#xff0c;layers]) 而不是modelmodels.Sequential(layers&#xff0c;layers) 文章目录 卷积…...

c#生成二维码二维码中间添加定制LoGo

&#x1f680;介绍 &#x1f340;QRCoder是一个开源的.NET库&#xff0c;用于生成QR码&#xff08;Quick Response Code&#xff09;。这个库是用C#编写的&#xff0c;并且可以在.NET框架的各种版本上使用&#xff0c;包括.NET Framework, .NET Core, Mono, Xamarin等。QRCode…...

设计CPU功能的数字电路

实验目的(1)熟悉Multisim 电路仿真软件的操作界面和功能; (2)掌握逻辑电路综合设计,并采用仿真软件进行仿真。 实验内容1.试设计一个简易CPU功能的数字电路,实验至少要求采用4个74HC/HCT194作为4个存储单元(可以预先对存储单元存储数据),74HC283作为计算单元。请实现…...

在windows下编译libiconv库

libiconv是一个基于GNU协议的开源库,主要用于解决多语言编码处理转换等应用问题。在linux系统使用比较方便,但是windows下使用需要进行源码编译。这里我是使用libiconv的1.15版本源码和VS2019默认工具集配置进行编译。 首先需要用VS2019创建一个空项目,根目录为libiconv。 在…...

html,css,开发知识,调试知识

nget 方式提交 n使用 get 方式提交数据时&#xff0c;表单数据会附加在 URL 之后&#xff0c;由用户端直接发送至服务器&#xff0c;所以速度比 post 快&#xff0c;但缺点是数据长度不能太长。 npost 方式提交 n使用 post 时&#xff0c;表单数据是与 URL 分开发送的&#…...

Vulnerability: File Upload(Medium)--MYSQL注入

选择难度&#xff1a; 1.打开DVWA&#xff0c;并登录账户 2.选择模式&#xff0c;这里我们选择 文件上载的中级模式&#xff08;Medium&#xff09; 准备工作 1.在vsc里面写个一句话木马 2.下载BurpSuiteCommunit软件&#xff1a;百度搜索“burp suite官网” 下载地址www…...

短视频账号剪辑矩阵+无人直播系统源头开发

抖去推爆款视频生成器&#xff0c;通过短视频矩阵、无人直播&#xff0c;文案引流等&#xff0c;打造实体商家员工矩阵、用户矩阵、直播矩阵&#xff0c;辅助商家品牌曝光&#xff0c;团购转化等多功能赋能商家拓客引流。 短视频矩阵通俗来讲就是批量剪辑视频和批量发布视频&am…...

Python traceback模块:获取异常信息

异常对象提供了一个 with_traceback 用于处理异常的传播轨迹&#xff0c;查看异常的传播轨迹可追踪异常触发的源头&#xff0c;也可看到异常一路触发的轨迹。 下面示例显示了如何显示异常传播轨迹&#xff1a; class SelfException(Exception): passdef main():firstMethod() …...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...