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

REDHAWK——连接(续)

文章目录

  • 前言
  • 一、突发 IO
    • 1、数据传输
      • ①、输入
      • ②、输出
    • 2、突发信号相关信息 (SRI)
    • 3、多输出端口
    • 4、使用复数数据
      • ①、在 C++ 中转换复数数据
    • 5、时间戳
    • 6、端口统计
      • ①、C++
  • 二、消息传递
    • 1、消息生产者
      • ①、创建一个消息生产者
      • ②、发送消息
    • 2、消息消费者
      • ①、创建消息消费者
      • ②、注册接收消息
    • 3、查看消息
    • 4、连接生产者和消费者
    • 5、连接回调
      • ①、C++
    • 6、自定义 IDL 接口
      • ①、连接反馈
      • ②、连接选择
      • ③、方法映射
      • ④、读取属性
      • ⑤、写入属性


前言

续上文


一、突发 IO

对于那些需要小型且可能是非连续的数据块(或突发)以及频繁变化的元数据的应用程序,突发输入/输出(BurstIO)提供了满足这些要求的数据传输容器和接口。这个接口仅支持数据向量的传输:float, double, octet (int8/uint8), short (int16), ushort (uint16), long (int32), ulong (uint32), longlong (int64), 和 ulonglong(uint64)。与批量输入/输出(BulkIO)类似,BurstIO 提供了突发信号相关信息(SRI)和精确时间戳,但是它通过每个数据突发中的带内信息提供这些信息。由于元数据的增加的开销要求,通过将多个突发分组为单次传输,无论是通过编程还是通过可配置的策略设置,BurstIO 可以实现其最高吞吐量,以尝试最大化效率并限制延迟

1、数据传输

突发输入/输出(BurstIO)数据传输通过 REDHAWK 资源(组件或设备)的 BurstIO 端口对象的 pushBurst()pushBursts() 方法调用来实现。资源可以使用这些 push 方法将突发及其关联的元数据从一个资源传输到另一个资源,这一过程在资源的服务功能内进行。与批量输入/输出(BulkIO)相似,BurstIO 接口为突发的每个数据向量提供相同的 BULKIO::PrecisionUTCTime 时间戳。BurstIO 定义了一个新的 BurstSRI 信号相关信息(SRI)对象,使开发人员能够进一步描述信号环境和数据转换。这些字段在突发信号相关信息(SRI)中有进一步的描述。

①、输入

拥有提供端口(输入端口)的资源,使用 getBurst() 方法从端口抓取数据。此方法从输入端口的数据队列返回一个 PacketType 对象(在突发包访问器中描述),如果队列为空,则返回 null/None 值。

以下代码片段是 getBurst() 方法的一个示例。

/**Grab data from the port's getBurst method*/
burstio::BurstShortIn::PacketType *pkt;
pkt = inShortPort->getBurst( bulkio::Const::NON_BLOCKING );// check if a valid packet was returned
if ( pkt == NULL ) {return NOOP;
}// check for EOS
if ( pkt->getEOS() ) {outShortPort->pushBurst(pkt->getSequence(), pkt->getSRI(), pkt->getEOS());
}...  perform algorithm on the data: pkt->getData() ... or pkt->getSequence()

在这里插入图片描述

②、输出

由于 BurstIO 数据的异步性,该接口使开发者能够控制从资源中输出(输出)突发。将突发数据从一个资源推送到另一个资源的两个主要方法调用是:pushBursts()pushBurst()pushBursts() 允许直接将多个突发作为 BurstType 对象的序列直接下游发送而 pushBurst() 提供了一个接口来排队推送单个突发,但根据突发的数量、总队列大小和发送间隔遵循策略指令。这两种方法都使用指定的路由约束和连接过滤器路由突发数据,这些可以通过以下接口控制:

// this route streams with Stream ID == "data-stream-one" to a connection
// identified as "connection-one"
shortBurstPort->addConnectionFilter("data-stream-one", "connection-one");

或者:

// update connection filter using the Component's connection property
// "myConnectionTable"
shortBurstPort->updateConnectionFilter(myConnectionTable);// this sets the stream filter to only route streams to specific connections
shortBurstPort->setRoutingMode(burstio::ROUTE_CONNECTION_STREAMS);

在这里插入图片描述
pushBurst()pushBursts() 方法之间的主要区别在于管理数据传输的方式和时间的能力。只有使用 pushBurst() 排队的突发流量受到策略约束的控制,而对 pushBursts() 的调用则直接发送到下游连接的资源。

// this method will limit the maximum number of bursts that
// can be queued  before they are sent
shortBurstPort->setMaxBursts(size_t count);// this method will enable threshold monitoring for the amount of sample
// data that exceeds this limit before sending data downstream
shortBurstPort->setByteThreshold(size_t bytes);// this method will enable the latency time between the sending of
// available data downstream
shortBurstPort->setLatencyThreshold( long usec );

以下代码片段是一个使用 pushBurst() 方法调用将向量数据样本排队到端口的示例。

std::vector< BurstShortOut::NativeType > data;
my_transform(data);BURSTIO::BurstSRI  sri;
burstio::BurstShortOut::BurstType burst;
burst.SRI = sri;
burst.EOS = false;
burst.T = burstio::utils::now();
burst.data.length(data.size());
for(int i=0; i< data.size(); i++ ) burst.data[i] = data[i];// this queues a single burst
shortBurstPort->pushBurst( burst );// orstd::vector< BurstShortOut::NativeType > data;
my_transform(data);// this queues a single burst
shortBurstPort->pushBurst( data, sri, burstio::utils::now() );

以下代码片段是一个使用 pushBursts() 方法调用的向量数据样本的示例。此调用中的突发直接传递到下游的连接资源。

std::vector< BurstShortOut::NativeType > data;
my_transform(data);BurstShortOut::BurstSequenceType bursts;
bursts.length(1);
burstio::BurstShortOut::BurstType burst;
burst.SRI = sri;
burst.EOS = false;
burst.T = burstio::utils::now();
burst.data.length(data.size());
for(int i=0; i< data.size(); i++ ) burst.data[i] = data[i];
bursts[0] = burst;// this pushes the burst directly downstream because
// it is a sequence of bursts
shortBurstPort->pushBursts(bursts);

2、突发信号相关信息 (SRI)

BurstSRI 对象随每个数据突发一起传送,并描述数据生产者的数据负载和处理状态。下表仅描述了在资源之间传递突发数据时数据结构的必需字段。
在这里插入图片描述

3、多输出端口

每个输出突发输入/输出(BurstIO)端口类型都提供了基于流 ID 和连接 ID 过滤来自资源的突发数据的能力。要使用端口的多出能力,资源必须包含类似于以下的代码:

<structsequence id="connectionTable"><struct id="connectionTable::connection_descriptor"name="connection_descriptor"><simple id="connectionTable::connection_id" name="connection_id"type="string"><kind kindtype="configure"/></simple><simple id="connectionTable::stream_id" name="stream_id" type="string"><kind kindtype="configure"/></simple><simple id="connectionTable::port_name" name="port_name" type="string"><kind kindtype="configure"/></simple></struct><configurationkind kindtype="configure"/>
</structsequence>

为了将特定的数据流引导到特定的连接,需要将 connectionTable 对象传递给端口的 updateConnectionFilter 方法。当路由模式设置为 ROUTE_CONNECTION_STREAMS 时,端口将会将过滤状态应用于通过资源的 BurstIO 端口传出的任何突发流量。要将突发传递给现有连接,端口的过滤器表中必须存在与下游资源的突发的流 ID 和连接 ID 匹配的项。

4、使用复数数据

每个传入数据的 BurstPacket 提供了 getComplex()` 方法,以表示向量是否包含复数样本(它由实部和虚部组成)。复数数据以交替的实部和虚部值发送。开发者可以以任何方式处理这些数据;然而,本节描述了将数据转换为更易于处理形式的常用方法。

①、在 C++ 中转换复数数据

在 C++ 中,传入的突发输入/输出(BurstIO)数据向量可以被强制转换为复数值的 std::vector。例如:

BurstShortIn::BurstPacket *pkt = myShortPort->getPacket(bulkio::Const::BLOCKING);
if ( pkt->isComplex() ) {BurstShortIn::ComplexType cplx_data = pkt->getComplexData();// ... do some processing with cplx_data
}

5、时间戳

以下代码段提供了一个示例,展示如何构造一个要在突发信号相关信息(SRI)中发送的 BULKIO::PrecisionUTCTime 时间戳。

/*** To create a time stamp from the current time of day*/BULKIO::PrecisionUTCTime tstamp = burstio::utils::now();

6、端口统计

所有突发输入/输出(BurstIO)端口支持批量输入/输出(BulkIO)统计接口,并添加了跟踪特定于突发的指标的额外关键词。统计数据是在 10 次 pushBurst 调用的窗口中跟踪的。输入端口包含单个 PortStatistics 结构,而输出端口包含一系列 PortStatistics 结构;每个连接一个结构。有关 BULKIO::PortStatistics 的更多信息,请参见端口统计。输入和输出端口的额外 BurstIO 指标在以下表格中描述:

①、C++

以下示例说明了一个组件,该组件对传入的突发数据进行转换,并将结果向下游推送。

burstio::BurstShortIn::PacketType *pkt;
pkt = inShortPort->getPacket(bulkio::Const::NON_BLOCKING);// check if a valid packet was returned
if ( pkt == NULL ) {return NOOP;
}// check for EOS
if ( pkt->getEOS() ) {outShortPort->pushBurst(pkt->getSequence(), pkt->getSRI(), pkt->getEOS());
}// do some processing.....to the burst contents
BurstShortOut::SequenceType  data =  do_some_magic(pkt->getSequence());// we changed the data so calc new time stamp....
BULKIO::PrecisionUTCTime newTS = calc_timestamp(pkt->getTime());  outShortPort->pushBurst(data, pkt->getSRI(), newTS, pkt->getEOS());

二、消息传递

消息传递依赖于 CORBA 的事件结构作为传输结构。在 CORBA 的事件 API 中,消息通过使用函数 push() 以 Any 类型传递。

虽然 CORBA 管理数据的编组和传递,但它并未提供任何固有于事件的机制来描述 Any 类型的内容。REDHAWK 决定利用现有的负载结构描述符来描述消息的负载,即属性接口描述语言(IDL)。选择此接口消除了创建描述消息的新 IDL 的需要。此外,已有一种 XML 结构映射到高效的二进制数据结构,允许使用 XML 来描述消息内容,同时消除了在消息传递机制中引入 XML 解析器的需要。

为了支持这项额外功能,REDHAWK 扩展了属性描述符,允许属性具有消息类型。唯一可以具有有效消息类型的属性是结构。

1、消息生产者

在创建新组件或编辑现有组件时,可以创建一个消息生产者。创建消息生产者后,您必须注册您的代码,以便从端口发送消息。以下程序解释了如何创建消息生产者并发送消息。

①、创建一个消息生产者

使用 REDHAWK IDE 向组件或设备添加消息生产者端口,请遵循以下步骤:

  • 1)从项目资源管理器视图中,双击组件的软件包描述符(SPD)文件。此时将显示组件编辑器。

  • 2)在组件编辑器中,选择“属性”标签。组件编辑器的属性标签页将被显示。
    在这里插入图片描述

  • 3)要添加结构属性,请点击“添加结构”。此时将显示属性标签的结构属性部分。
    在这里插入图片描述

  • 4)在结构属性部分,输入产生的消息的名称。ID 默认为您输入的名称。从“类型(Kind)”下拉菜单中,选择“消息(message)。
    在这里插入图片描述

  • 5)在“所有属性(All Properties)”部分,选择您添加的结构属性。默认情况下,已经存在一个简单成员。您可以修改它并为结构属性创建额外的成员。有关属性结构、类型和种类的更多信息,请参考管理和定义属性。修改和/或创建这些成员后,结构的成员和相应的属性信息将被显示。
    在这里插入图片描述

  • 6)选择“端口(Ports)”标签,点击“添加(Add)”,并在“名称(Name)”字段中输入名称。在“端口详情(Port Details)”部分,在“方向(Direction)”下拉菜单中选择“出(out )”。在“接口(Interface)”字段旁,点击“浏览(Browse)”。将显示“选择接口(Select an Interface)”对话框。从显示的接口列表中,选择“ExtendedEvent> MessageEvent”并点击“确定(OK)”。此时将显示消息生产者端口的信息。
    在这里插入图片描述

  • 7)重新生成组件。创建消息生产者后,您可以从消息生产者端口发送消息。

②、发送消息

以下代码示例演示了如何在 C++中从组件的消息输出端口向事件通道或另一个组件的消息输入端口发送外发消息。

出于以下示例的目的,假设结构如下:

  • id: foo
  • 包含两个成员:
    • name: some_string, type: string
    • name: some_float, type: float
  • 组件的 uses 端口称为 message_out
  • 组件的名称是 message_producer
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在每个示例中,通过声明该类型的变量来创建消息。然后,设置其状态,并使用消息端口的 sendMessage() 方法发送消息,消息变量作为参数。

C++:
要生成消息,可以在实现文件的 serviceFunction() 方法中添加以下代码。

foo_struct my_msg;
my_msg.some_string = "hello";
my_msg.some_float = 1.0;
this->message_out->sendMessage(my_msg);
// Send a message to a specific connection by providing a `connectionId` parameter.
// If `connectionId` does not match any connection, an `std::illegal_argument` exception is thrown.
this->message_out->sendMessage(my_msg, "connection_1");

在这里插入图片描述

2、消息消费者

在创建新组件或编辑现有组件时,可以创建消息消费者。创建消息消费者后,您必须注册您的代码以从端口接收消息。以下程序解释了如何创建消息消费者并注册代码以处理消息。

①、创建消息消费者

流程同上消息生产者流程,与创建消息消费者流程不同之处只是在端口详细信息部分的方向下拉列表中,选择bi-dir<uses/provides>

②、注册接收消息

以下示例解释了如何在 C++中注册代码以处理传入消息。

出于以下示例的目的,假设结构如下:

  • id: foo
  • 包含两个成员:
    • name: some_string, type: string
    • name: some_float, type: float
  • 组件的 uses/provides 端口称为 message_in
  • 组件的此消息的回调函数为 messageReceived()
  • 组件的名称是 message_consumer

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果此组件与消息生产者或事件通道之间存在连接,则以下代码示例将处理传入消息。

任何带有属性 ID foo 的消息都将触发回调函数 messageReceived()。

C++ :
鉴于事件的异步性质,为消费者选择了回调模式。在组件头文件中,声明以下回调函数:

void messageReceived(const std::string &id, const foo_struct &msg);

在这里插入图片描述
在组件源文件中,实现回调函数:

void message_consumer_i::messageReceived(const std::string &id, const foo_struct &msg) {LOG_INFO(message_consumer_i, id<<" "<<msg.some_float<<" "<<msg.some_string);
}

在这里插入图片描述
在构造器(constructor())方法中,注册回调函数:

message_in->registerMessage("foo", this, &message_consumer_i::messageReceived);

在这里插入图片描述

3、查看消息

消息是事件,其有效负载定义与组件属性中的结构相关联。查看消息可以使用用于查看事件的相同技术。
要在终端窗口查看发送到事件通道的事件和消息:

eventviewer <domain name> <event channel>

实用程序的帮助:

eventviewer --help

eventviewer REDHAWK_DEV testchan
示例输出:
在这里插入图片描述
这里出现了错误,还未找到解决办法,待后续找到后修改

4、连接生产者和消费者

生产者和消费者可以点对点连接,也可以通过IDE 中的事件通道连接。将生产者直接连接到消费者不需要应用程序,并且可以在沙箱中完成:

from ossie.utils import sb
sb.catalog()
#['structs_test', 'm_in', 'prop_changes', 'm_out','pass']
prod=sb.launch("m_out")
cons=sb.launch("m_in")
prod.connect(cons)
#True
sb.start()

在这里插入图片描述
这里出现了错误,还未找到解决办法,待后续找到后修改

5、连接回调

在组件中,许多 REDHAWK 中的 Uses 端口类支持在连接建立或断开时进行通知。支持的端口类型和语法因语言而异。

①、C++

在 C++ 中,Bulk 输入/输出(BulkIO)、Burst 输入/输出(BurstIO)和消息 Uses 端口的连接通知机制已标准化。连接和断开回调被注册在端口上。

以下示例假设一个 C++ 组件具有 BulkIO 浮点输出端口,dataFloat_out;然而,对于 BurstIO 和消息端口,语法是相同的。

在组件头文件中,将回调声明为私有成员函数。连接和断开回调都接收单一参数,连接 ID(一个引用的 std::string):

void dataFloatConnected(const std::string& connectionId);
void dataFloatDisconnected(const std::string& connectionId);

在组件源文件中,实现回调函数:

void MyComponent_i::dataFloatConnected(const std::string& connectionId)
{LOG_INFO(MyComponent_i, "New connection " << connectionId << " on dataFloat_out");
}void MyComponent_i::dataFloatDisconnected(const std::string& connectionId)
{LOG_INFO(MyComponent_i, "Disconnected " << connectionId << " on dataFloat_out");
}

然后,在组件 constructor() 中注册回调函数

dataFloat_out->addConnectListener(this, &MyComponent_i::dataFloatConnected);
dataFloat_out->addDisconnectListener(this, &MyComponent_i::dataFloatDisconnected);

addConnect Listener()addDisconnectListener() 接受两个参数:目标对象(通常是this)和一个指向成员函数的指针。

没有必要同时注册连接和断开回调。

6、自定义 IDL 接口

REDHAWK提供前端接口(FEI)和标准核心框架(CF)接口(如 CF::Resource),用于控制实体并促进互操作性。在某些用例中,您可能会发现需要使用自定义接口描述语言(IDL)来控制实体。对于这些用例,您可以在 IDE 中创建自定义 IDL 项目。

将端口从 FEI 接口或自定义 IDL 接口添加到组件或设备中,允许该实体通过 CORBA 控制其他实体。由于这些端口的通用性质,不可能创建像 BulkIO 这样的语言映射,因此交互是通过标准的 CORBA API 进行的,其完整描述超出了本手册的范围。然而,REDHAWK 代码生成器将生成简化与端口交互的端口。以下部分解释了使用(输出)端口的情况,因为它们最有可能被生成,例如,用于控制 FEI 设备。

①、连接反馈

在所有三种支持的语言中,FEI、标准 CF 或自定义 IDL 端口将有所有方法和属性映射到端口,并且端口将委托调用给远程连接。在 REDHAWK 中,端口可能没有连接、有一个连接或多个连接。这些条件中的每一个都可能为使用端口进行通信的人创建问题;例如,如果发送了一个控制请求并且没有连接,那么用户应该被告知请求没有发送到任何地方。

同时,并非所有方法都是相同的。一些方法只在一个方向上推送数据,一些方法有返回值,一些方法有作为指针的参数,需要用信息填充(输出或输入/输出参数)。当调用端口方法并且端口无法进行调用或调用无法明确时(例如,如果存在两个连接并且函数包含返回值),则在用户代码中引发 PortCallError。下表描述了满足的方法签名标准及其对应的行为。
在这里插入图片描述
如果一个方法作为其非异常 API 的一部分有任何形式的返回值(表现为非 void 返回值,或一个输出或输入/输出参数),那么如果端口有多于一个的连接,就会引发一个异常。此外,如果尝试调用时实际上没有连接,就会引发一个错误。

②、连接选择

虽然当所需的连接不明确时,生成的端口类会触发一个错误,但它也包含一个 API,允许开发者选择应该使用哪个连接。每个方法都有一个可选参数,connection_id,允许调用者明确应该使用哪个连接。默认值行为将使用最后建立的连接。如果指定的 connection_id 不存在,将引发 PortCallError。

在以下部分中,用于明确连接的相同模式在所有三种支持的语言中都提供了。

以下代码示例使用调用 CF::File 接口的 read 方法时的默认行为。

 CF::OctetSequence_var _data = new CF::OctetSequence();CF::OctetSequence_out data(_data);this->file_out->read(data, 10); // read 10 characters from the last connection made to the port

以下代码示例将读取调用明确指向一个特定的连接,connection1。

 CF::OctetSequence_var _data = new CF::OctetSequence();CF::OctetSequence_out data(_data);this->file_out->read(data, 10, "connection1"); // read 10 characters from the connection called "connection1"

要查看可用的连接,请使用以下代码:

 std::vector<std::string> _connection_ids = this->file_out->getConnectionIds();

③、方法映射

方法名称映射遵循在连接选择中描述的模式;即方法名称与 IDL 中描述的名称相同,但增加了一个额外的参数(可选地使用),可以指定应使用哪个连接。属性被映射为对 CORBA 对象的函数。REDHAWK 提供额外的 API 来消除对多个连接的调用的歧义。

④、读取属性

通过调用属性的名称作为函数来执行读取属性。例如,如果端口 my_port 包含字符串属性 greeting,则可以如下检索 greeting 的值:

 std::string _greeting = this->my_port->greeting();

要从特定连接检索值,需要_get_前缀:

 std::string _greeting = this->my_port->_get_greeting("some_connection_name");

⑤、写入属性

在 C++ 中写入属性涉及使用适当的参数调用函数:

 this->my_port->greeting("hello"); // write "hello" to the attribute "greeting"this->my_port->greeting("hello", "some_connection_name"); // write "hello" to the attribute "greeting" over connection "some_connection_name"

我的qq:2442391036,欢迎交流!


相关文章:

REDHAWK——连接(续)

文章目录 前言一、突发 IO1、数据传输①、输入②、输出 2、突发信号相关信息 (SRI)3、多输出端口4、使用复数数据①、在 C 中转换复数数据 5、时间戳6、端口统计①、C 二、消息传递1、消息生产者①、创建一个消息生产者②、发送消息 2、消息消费者①、创建消息消费者②、注册接…...

9.Python从入门到精通—Python 字符串格式化,三引号,Unicode 字符串

9.Python从入门到精通—Python 字符串格式化,三引号,Unicode 字符串 Python 字符串格式化Python 三引号Unicode 字符串创建 Unicode 字符串Python 的字符串内建函数 Python 字符串格式化 Python中的字符串格式化是指将一个字符串中的占位符替换为指定的值。Python中有多种字符串…...

O2OA(翱途)开发平台系统安全-用户登录IP限制

O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]支持对指定的用户设置可以连接的客户端计算机的IP地址&#xff0c;以避免用户在不安全的环境下访问系统。本篇主要介绍如何开启O2OA用户登录IP限制。 一、先决条件&#xff1a; 1、O2Server服务器正常运行&#xff0c;系统安装部…...

DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x800c000d

报出这个问题&#xff0c;应该是对给的url解析不正确&#xff0c;我给的是rtsp的视频流地址&#xff0c;应该是对该格式解析异常。 所以参考两篇文&#xff1a; QT无法播放视频&#xff1a;报错&#xff1a;DirectShowPlayerService::doRender: Unresolved error code 0x8004…...

【测试流程及规范】8000字超详细完整版

前言&#xff1a; 首先注明该文由本人原创&#xff0c;转载时需注明出处&#xff1b;团队背景&#xff1a;测试团队加上我一共5名&#xff0c;Java开发10多位&#xff0c;前端3位&#xff0c;产品4位&#xff0c;还有架构工程师、运维等&#xff1b;公司IT团队开发的系统仅供内…...

第十四届蓝桥杯省赛真题 Java C 组【原卷】

文章目录 发现宝藏【考生须知】试题 A \mathrm{A} A : 求和试题 B: 分糖果试题 C: 三国游戏试题 D : \mathrm{D}: D: 平均试题 E \mathrm{E} E : 填充试题 F : \mathrm{F}: F: 棋盘试题 G: 子矩阵试题 H: 公因数匹配试题 I: 异或和之差试题 J : \mathrm{J}: J: 太阳 发现宝…...

v-model 粗略解析

v-model 粗略解析 v-model是什么&#xff1f; 双向数据绑定&#xff0c;可以从data流向页面&#xff0c;也可以从页面流向data通常用于表单收集&#xff0c;v-model 默认绑定 value 值书写形式&#xff1a; v-model:value"" 或 v-model v-model原理是什么&#xf…...

【vue elementUI】修改el-dropdown样式

实现效果如下&#xff1a; 代码如下&#xff1a; <el-dropdown trigger"click" command"handleCommand" active-text-color"#606266"><span class"product-card">{{getCategoryName(categoryId)}}</span><el-dro…...

6语言交易所/多语言交易所php源码/微盘PHP源码

6语言交易所PHP源码&#xff0c;简单测试了一下&#xff0c;功能基本都是正常的。 由于是在本地测试的运行环境的问题&#xff0c;K线接口有点问题&#xff0c;应该在正式环境下是OK的。 源码下载地址&#xff1a;6语言交易所/多语言交易所php源码/微盘PHP源码.zip 程序截图…...

动态规划——传球问题

题目链接&#xff1a;1.传球游戏 - 蓝桥云课 (lanqiao.cn) 本题关键在于动态规划的数组设计&#xff0c;以及围坐一圈时索引的变化。 首先是动态规划&#xff0c;由于是求球传递m次回到第一位同学&#xff0c;那么就可以设计成一个二维数组&#xff0c;每个位置代表的是&#x…...

Spring: 文件服务使用spring.web.resources.static-locations配置实现文件预览功能

文章目录 一、spring.web.resources.static-locations配置实现文件预览功能1、来实现文件预览的步骤2、总结 二、其他的文件预览实现方式1、使用Controller处理文件预览请求2、集成第三方文件预览库3、使用专门的文件预览服务4、配置Nginx等反向代理进行文件预览5、注意事项&am…...

分享常用的62 个九宫格抽奖及各种宫格效果源码

九宫格抽奖及各种宫格效果详细介绍 功演示效果及源码下载地址&#xff1a;https://www.erdangjiade.com/js/17-0-0-0 九宫格抽奖盘是一种常见的抽奖形式&#xff0c;由九个格子组成&#xff0c;每个格子代表一个奖项。抽奖时&#xff0c;指针会随机旋转&#xff0c;最终落在某…...

【Stable Diffusion】入门-03:图生图基本步骤+参数解读

目录 1 图生图原理2 基本步骤2.1 导入图片2.2 书写提示词2.3 参数调整 3 随机种子的含义4 拓展应用 1 图生图原理 当提示词不足以表达你的想法&#xff0c;或者你希望以一个更为简单清晰的方式传递一些要求的时候&#xff0c;可以给AI输入一张图片&#xff0c;此时图片和文字是…...

数学建模-多目标规划算法(美赛建模)

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是viperrrrrrr~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff…...

安装、配置MySQL

安装相关软件 MySQL Server、MySQL Workbench MySQL Server&#xff1a;专门用来提供数据存储和服务的软件 MySQL Workbench&#xff1a;可视化的 MySQL 管理工具 官网安装 https://www.mysql.com/ 官网 MySQL :: Download MySQL Installer 安装包路径 在这里选择版本和和对应…...

C++面试100问(九)

C中typdef和#define区别&#xff1f; #define是预处理命令&#xff0c;在预处理是执行简单的替换&#xff0c;不做正确性的检查&#xff1b;typedef是在编译时处理的&#xff0c;它是在自己的作用域内给已经存在的类型一个别名。 C中有哪些调试程序的方法&#xff1f; windows…...

出海品牌必备指南:海外网红营销5大底层逻辑解析

随着全球化的推进&#xff0c;品牌出海已经成为许多企业拓展市场的重要策略之一。在这个过程中&#xff0c;海外网红营销成为品牌吸引目标受众、提升知名度的有效工具。然而&#xff0c;要在海外市场取得成功&#xff0c;并不仅仅是找准网红合作伙伴&#xff0c;更需要深入了解…...

Linux/Ubuntu/Debian的终端中和的区别

下边举例说明&#xff1a; “cd /home & wine ps.exe”和“cd /home && wine ps.exe”之间的区别在于命令在类 Unix shell 环境&#xff08;例如 Linux 或 macOS&#xff09;中执行的方式&#xff1a; ‘cd /home & wine ps.exe’: 在此命令中&#xff0c;“…...

docker compose部署opensearch集群

docker compose 配置 假设有两台电脑 A电脑的ip为192.168.1.100 B电脑的ip为192.168.1.103 A电脑的docker compose 配置 version: 3services:opensearch:image: opensearchproject/opensearch:2.1.0container_name: opensearch-node-1environment:- cluster.nameopensearch-c…...

粤嵌6818开发板通过MobaXterm使用SSH连接开发板

链接&#xff1a;https://pan.baidu.com/s/18ISP4Ub1HtQx6jCvTQTUHw?pwdfjmu 提取码&#xff1a;fjmu 1.把SSH_config.tar.bz 下载到开发板中 2.解压 SSH_config.tar.bz 解压命令&#xff1a;tar -xzvf SSH_config.tar.bz 3.配置SSH 进入SSH/openssh目录&am…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...