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

深入探讨DICOM医学影像中的MPPS服务及其具体实现

深入探讨DICOM医学影像中的MPPS服务及其具体实现

1. 引言

在医疗影像的管理和传输过程中,DICOM(数字影像和通信医学)标准发挥着至关重要的作用。除了DICOM影像的存储和传输(如影像存储SCP和影像传输SCP),DICOM还定义了其他一系列服务以支持医疗影像的完整管理。其中,**MPPS(Modality Performed Procedure Step)**服务是医疗影像工作流中的一个重要环节,它允许影像设备(如CT、MRI等)向PACS(Picture Archiving and Communication System)或者其他管理系统报告影像操作的执行状态。

MPPS主要用于向影像存储系统报告影像采集或程序执行的状态,确保医疗流程的协同和及时反馈。本文将深入探讨DICOM MPPS服务的概念、功能、工作流程及其在C#中的具体实现。

在这里插入图片描述

2. MPPS服务概述

2.1 MPPS服务功能

MPPS服务通过向影像存储系统(如PACS)报告影像采集或相关程序执行的状态,从而提供实时反馈。它主要有以下功能:

  1. 报告影像程序的执行状态

    • 影像采集设备(例如CT扫描仪)执行影像采集后,可以通过MPPS报告程序的执行状态。例如,报告扫描是否完成,是否成功,是否存在错误等。
  2. 更新影像程序的进度

    • 在影像采集过程中,MPPS可以定期向PACS报告当前的执行进度(如扫描完成的百分比)。
  3. 同步影像采集与影像存储

    • 当影像采集完成后,MPPS报告会触发后续的存储过程(例如影像数据的存储)。

2.2 MPPS的工作原理

MPPS服务基于DICOM协议,通过以下几个步骤与影像系统进行交互:

  1. 设备发送MPPS消息

    • 影像采集设备在进行影像操作时,生成一个MPPS消息,其中包括影像程序的执行状态和相关信息。
  2. 系统接收MPPS消息

    • PACS或影像管理系统作为MPPS的接收者,通过DICOM协议接收这些消息,并根据其中的状态信息更新系统中的数据。
  3. 影像存储触发

    • MPPS消息的发送通常与影像数据存储过程紧密结合,当扫描操作完成时,设备会发送MPPS消息,通知影像数据已经准备好存储。

2.3 MPPS消息的结构

MPPS服务使用DICOM对象来表示影像操作的状态,通常包括以下几个重要字段:

  • SOP Class UID:标识MPPS的服务类别。
  • SOP Instance UID:标识具体的MPPS实例。
  • Study Instance UID:与影像操作相关的Study实例UID。
  • Procedure Step Status:影像操作的状态,如“完成(COMPLETED)”、“处理中(IN PROGRESS)”、“失败(FAILED)”等。
  • Scheduled Procedure Step ID:与影像操作对应的预定步骤ID。

2.4 MPPS的应用场景

  • 影像设备(Modality)报告程序状态:如在扫描过程中,CT设备会通过MPPS告知PACS扫描的进度和状态。
  • 进度更新与反馈:影像设备在采集过程中逐步报告进度,实时更新工作状态。
  • 工作流协调:MPPS消息可以与其他DICOM服务(如存储SCP、影像打印SCP等)配合使用,协同完成影像采集、存储、传输等工作。

3. MPPS服务的实现:基于C#的示例

接下来,我们将介绍如何在C#中实现一个简单的MPPS服务。我们使用fo-dicom库,它是一个开源的C# DICOM库,支持DICOM协议的各种操作,包括MPPS消息的发送和接收。

3.1 环境准备

  1. 安装.NET SDK:确保安装了最新版本的.NET SDK。

  2. 安装fo-dicom:fo-dicom库是一个常用的DICOM处理库,我们将在项目中使用它来实现MPPS服务。

    在命令行中执行以下命令来安装fo-dicom:

    dotnet add package fo-dicom
    

3.2 创建MPPS服务

在本示例中,我们将实现一个MPPS服务,它能够接收影像设备发来的MPPS消息并处理。我们将使用ASP.NET Core创建一个简单的Web API服务,模拟接收MPPS消息并返回处理结果。

1. 创建ASP.NET Core Web API项目

在Visual Studio中创建一个新的ASP.NET Core Web API项目,选择**.NET 6.0**或更高版本。

2. 安装fo-dicom库

打开NuGet包管理器并安装fo-dicom库:

dotnet add package fo-dicom
3. 编写MPPS服务的Controller

在项目的Controllers文件夹中,创建一个名为MppsController.cs的控制器,用于接收和处理MPPS消息。

using Microsoft.AspNetCore.Mvc;
using Dicom;
using Dicom.Network;
using System;
using System.Threading.Tasks;namespace DICOMMPPSService.Controllers
{[Route("api/[controller]")][ApiController]public class MppsController : ControllerBase{// 处理MPPS请求[HttpPost("mpps")]public async Task<IActionResult> ReceiveMppsMessage([FromBody] DicomMessage mppsMessage){try{// 解析MPPS消息var status = mppsMessage.Dataset.GetString(DicomTag.ProcedureStepStatus);var studyUid = mppsMessage.Dataset.GetString(DicomTag.StudyInstanceUID);var seriesUid = mppsMessage.Dataset.GetString(DicomTag.SeriesInstanceUID);// 在这里可以进一步处理MPPS消息,更新影像状态,记录日志等Console.WriteLine($"Received MPPS message: Status={status}, StudyUID={studyUid}, SeriesUID={seriesUid}");// 返回成功的响应return Ok(new { Message = "MPPS message received successfully" });}catch (Exception ex){// 处理错误并返回失败的响应Console.WriteLine($"Error processing MPPS message: {ex.Message}");return BadRequest(new { Message = "Error processing MPPS message" });}}}
}
4. 配置启动类(Startup.cs)

Startup.cs文件中,配置服务和请求管道,确保API能够正确运行。

public void ConfigureServices(IServiceCollection services)
{services.AddControllers();
}public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});
}
5. 模拟发送MPPS消息

在实际应用中,MPPS消息通常由影像设备(如CT扫描仪)发送到PACS或其他影像管理系统。我们可以模拟发送MPPS消息,通过fo-dicom库向MPPS服务发送一条简单的消息。

using Dicom;
using Dicom.Network;
using System;
using System.Threading.Tasks;namespace DICOMMPPSClient
{class Program{static async Task Main(string[] args){// 创建一个DICOM MPPS请求消息var mppsMessage = new DicomMessage();mppsMessage.Dataset.Add(DicomTag.StudyInstanceUID, "1.2.3.4.5.6");mppsMessage.Dataset.Add(DicomTag.SeriesInstanceUID, "1.2.3.4.5.6.7");mppsMessage.Dataset.Add(DicomTag.ProcedureStepStatus, "COMPLETED");// 连接到MPPS服务并发送消息var client = new DicomClient();client.NegotiateAsyncOps();await client.AddRequestAsync(new DicomCStoreRequest(mppsMessage));// 连接到本地API服务并模拟发送POST请求using (var httpClient = new System.Net.Http.HttpClient()){var json = new StringContent(mppsMessage.ToString(), System.Text.Encoding.UTF8, "application/json");var response = await httpClient.PostAsync("http://localhost:5000/api/mpps", json);var responseContent = await response.Content.ReadAsStringAsync();Console.WriteLine($"Response from MPPS API: {responseContent}");}}}
}

3.3 测试与验证

接下来,我们将继续测试和验证我们实现的MPPS服务。

1. 启动MPPS服务

首先,启动ASP.NET Core Web API服务(可以使用Visual Studio的调试功能或命令行运行),并确保服务正常运行。如果你使用的是命令行,可以在项目目录下运行以下命令来启动应用:

dotnet run

这样,我们的MPPS服务将在 http://localhost:5000 上监听请求。

2. 模拟发送MPPS消息

使用前面提到的模拟客户端代码(DICOMMPPSClient),运行该客户端程序以模拟影像设备发送MPPS消息。运行以下命令来启动该客户端:

dotnet run

模拟客户端会连接到MPPS服务,并通过POST请求将MPPS消息发送给服务端。MPPS消息的内容包括:

  • Study Instance UID:唯一标识一项医学影像检查的ID。
  • Series Instance UID:唯一标识影像序列的ID。
  • Procedure Step Status:表示该程序步骤的当前状态(如“已完成(COMPLETED)”)。

3. 验证处理结果

在客户端成功发送MPPS消息后,API应该会接收到这个消息,并打印出以下日志:

Received MPPS message: Status=COMPLETED, StudyUID=1.2.3.4.5.6, SeriesUID=1.2.3.4.5.6.7

如果MPPS消息处理成功,API会返回如下的成功响应:

{"Message": "MPPS message received successfully"
}

在模拟客户端中,你应该能够看到:

Response from MPPS API: {"Message":"MPPS message received successfully"}

4. 查看MPPS消息的日志

此外,可以通过查看控制台日志来跟踪接收到的MPPS消息。我们在ReceiveMppsMessage方法中记录了消息的关键信息(如StudyInstanceUIDSeriesInstanceUIDProcedureStepStatus)。这些日志可以帮助开发者在调试时理解MPPS消息的状态。

4. 安全性和性能优化

4.1 安全性

MPPS服务在处理敏感的医学影像数据时,安全性非常重要。以下是一些加强MPPS服务安全性的措施:

  1. HTTPS加密

    • 使用HTTPS协议来加密MPPS消息的传输。通过SSL/TLS加密,确保敏感数据(如患者信息、影像数据等)不会在传输过程中被窃听或篡改。
    • 可以在Startup.cs中强制启用HTTPS,如下所示:
      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Home/Error");app.UseHsts();  // 启用HTTP严格传输安全}app.UseHttpsRedirection();app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});
      }
      
  2. 身份验证和授权

    • 对于MPPS消息的接收和处理,可以使用OAuth2.0、JWT(JSON Web Tokens)等认证机制确保只有授权的设备或用户才能发送MPPS消息。
    • 可以在API中引入身份验证(例如使用Bearer Token进行API请求认证):
      public void ConfigureServices(IServiceCollection services)
      {services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{options.Authority = "https://your-identity-server.com";options.Audience = "api";});services.AddControllers();
      }
      
  3. 访问控制

    • MPPS服务接收的消息通常涉及患者的个人健康信息,因此需要对不同的用户和设备设定访问控制策略。可以基于角色的访问控制(RBAC)来确保只有具有合适权限的用户能够操作影像数据。
  4. 数据加密

    • 除了传输加密外,存储在服务器上的MPPS消息和相关影像数据也应进行加密。确保即使服务器遭到攻击,数据也不会泄露。

4.2 性能优化

对于高并发情况下的MPPS消息处理,性能优化至关重要。以下是一些优化策略:

  1. 异步处理

    • 在处理MPPS消息时,可以使用异步编程模型(async/await)来避免阻塞线程,提高系统的吞吐量。

    • 例如,使用async Task<IActionResult>来处理每个MPPS请求:

      [HttpPost("mpps")]
      public async Task<IActionResult> ReceiveMppsMessage([FromBody] DicomMessage mppsMessage)
      {try{// 异步处理消息await ProcessMppsMessageAsync(mppsMessage);return Ok(new { Message = "MPPS message received successfully" });}catch (Exception ex){return BadRequest(new { Message = $"Error processing MPPS message: {ex.Message}" });}
      }private async Task ProcessMppsMessageAsync(DicomMessage mppsMessage)
      {// 模拟一些耗时操作await Task.Delay(100);  // 这里可以替换为数据库写入等操作
      }
      
  2. 消息队列

    • 当高并发请求到来时,直接处理可能会导致服务崩溃或响应时间过长。此时,可以使用消息队列(如RabbitMQ、Kafka等)来异步处理MPPS消息。将收到的消息先入队,后台工作者从队列中获取消息并异步处理。

    示例(使用RabbitMQ):

    // 发送MPPS消息到队列
    var factory = new ConnectionFactory() { HostName = "localhost" };
    using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
    {channel.QueueDeclare(queue: "MPPSQueue", durable: false, exclusive: false, autoDelete: false, arguments: null);string message = "MPPS Message data";var body = Encoding.UTF8.GetBytes(message);channel.BasicPublish(exchange: "", routingKey: "MPPSQueue", basicProperties: null, body: body);
    }
    
  3. 数据缓存

    • 对于频繁使用的数据(例如影像状态、患者信息等),可以采用缓存机制(如内存缓存、分布式缓存)来减少数据库查询的负担,提升响应速度。
  4. 负载均衡

    • 如果MPPS服务需要处理大量并发请求,可以通过负载均衡器(如Nginx、HAProxy等)将请求分配到多个服务实例,以保证系统的高可用性和横向扩展性。
  5. 数据库优化

    • 如果MPPS消息涉及对数据库的读取或写入操作,可以通过数据库优化(如索引、分区、查询优化等)来提高性能,确保在高并发情况下数据库能够处理大量请求。

5. 总结

MPPS服务在医疗影像管理和工作流中扮演着重要的角色,尤其在协调影像采集设备与影像存储系统之间的操作时。通过DICOM协议,影像设备能够向PACS报告影像程序的执行状态,确保影像存储过程的同步和实时反馈。

在本文中,我们通过一个基于C#的实现示例,展示了如何使用ASP.NET Core和fo-dicom库构建MPPS服务。通过实际代码示例,我们展示了如何接收、处理MPPS消息以及如何进行安全性和性能优化。

为了应对实际应用中的高并发和高可靠性需求,我们还探讨了使用异步编程、消息队列、负载均衡等技术来优化MPPS服务的性能。通过这些优化措施,能够确保MPPS服务在高并发场景下稳定运行,同时保障数据的安全性。

希望本文为您提供了有关DICOM MPPS服务的全面理解,并能帮助您在实际开发中更好地实现这一功能。

相关文章:

深入探讨DICOM医学影像中的MPPS服务及其具体实现

深入探讨DICOM医学影像中的MPPS服务及其具体实现 1. 引言 在医疗影像的管理和传输过程中&#xff0c;DICOM&#xff08;数字影像和通信医学&#xff09;标准发挥着至关重要的作用。除了DICOM影像的存储和传输&#xff08;如影像存储SCP和影像传输SCP&#xff09;&#xff0c;…...

集合帖:区间问题

一、AcWing 803&#xff1a;区间合并 &#xff08;1&#xff09;题目来源&#xff1a;https://www.acwing.com/problem/content/805/ &#xff08;2&#xff09;算法代码&#xff1a;https://blog.csdn.net/hnjzsyjyj/article/details/145067059 #include <bits/stdc.h>…...

C#,入门教程(27)——应用程序(Application)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(26)——数据的基本概念与使用方法https://blog.csdn.net/beijinghorn/article/details/124952589 一、什么是应用程序 Application&#xff1f; 应用程序是编程的结果。一般把代码经过编译&#xff08;等&#xff09;过程&#…...

迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!

经过前期内测调试&#xff0c;ROS固定翼开源仿真平台今日正式上线&#xff01;现平台除适配PX4ROS环境外&#xff0c;也已实现APROS环境下的单机飞行控制仿真适配。欢迎大家通过文末链接查看项目地址以及具体使用手册。 1 平台简介 ROS固定翼仿真平台旨在实现固定翼无人机决策…...

CSS 样式 box-sizing: border-box; 详细解读

box-sizing是 CSS 中的一个属性&#xff0c;用于控制元素的盒模型计算方式。border-box值表示元素的宽度和高度将包括内边距&#xff08;padding&#xff09;和边框&#xff08;border&#xff09;&#xff0c;而不仅仅是内容的宽度和高度。这意味着当你为元素设置宽度和高度时…...

FLASK创建下载

html用a标签 <!-- Button to download the image --> <a href"{{ url_for(download_file, filenameimage.png) }}"><button>Download Image</button> </a> 后端&#xff1a;url_for双大括号即是用来插入变量到模板中的语法。也就是绑…...

漫话架构师|什么是系统架构设计师(开篇)

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 关注犬余&#xff0c;共同进步 技术从此不孤单...

Web Socket

Web Socket ‌WebSocket‌是一种基于TCP的网络通信协议&#xff0c;允许客户端和服务器之间建立全双工&#xff08;双向&#xff09;通信通道。WebSocket通过HTTP协议进行握手&#xff0c;建立连接后&#xff0c;客户端和服务器可以在同一个连接上同时发送和接收数据&#xff0…...

JavaSE学习心得(反射篇)

反射 前言 获取class对象的三种方式 利用反射获取构造方法 利用反射获取成员变量 利用反射获取成员方法 练习 保存信息 跟配置文件结合动态创建 前言 接上期文章&#xff1a;JavaSE学习心得&#xff08;多线程与网络编程篇&#xff09; 教程链接&#xff1a;黑马…...

使用FRP进行内网穿透

一、基本概念 内网穿透&#xff1a;它是一种网络技术或方法&#xff0c;旨在允许外部网络&#xff08;如互联网&#xff09;访问位于内部网络&#xff08;内网&#xff09;中的设备或服务。由于内部网络通常处于NAT&#xff08;网络地址转换&#xff09;、防火墙或其他安全机制…...

长安“战疫”网络安全公益赛的一些随想

起因 今年刚进入大学&#xff0c;开始带校队&#xff0c;为了培养校队新成员&#xff0c;也就一直计划着和当地的一些高校合作交流&#xff0c;但是由于种种原因一直被搁置下来。正巧学校信息中心和四叶草有一个培训项目的合作&#xff0c;学校的网安协会也算是沾了光成为了培…...

flutter 安卓端打包

在 Flutter 中打包 Android 应用程序是一个相对简单的过程。你可以使用 Flutter 的命令行工具来构建并打包你的 APK 或 AAB&#xff08;Android App Bundle&#xff09;。以下是打包 Flutter Android 应用的步骤&#xff1a; 1. 安装 Flutter 环境 确保你已经安装了 Flutter …...

Cesium中的CustomDataSource 详解

Cesium CustomDataSource 详解 在 Cesium 中&#xff0c;CustomDataSource 是一个强大的类&#xff0c;用于处理自定义的地理数据。它提供了一种方法&#xff0c;可以通过程序方式添加、管理和更新动态的地理实体&#xff0c;而无需依赖外部数据格式&#xff08;如 GeoJSON 或…...

[Qt]常用控件介绍-按钮类控件-QPushButton、QRedioButton、QCheckBox、QToolButton控件

目录 1.QPushButton按钮 介绍 属性 Demo&#xff1a;键盘方向键控制人物移动 2.Redio Button按钮 属性 clicked、pressed、released、toggled区别 单选按钮的分组 Demo&#xff1a;点餐小程序 3.CheckBox按钮 属性 Demo&#xff1a;获取今天的形成计划 4.ToolBu…...

Windows 蓝牙驱动开发-安装蓝牙设备

蓝牙配置文件驱动程序有两种安装类型&#xff1a; 客户端安装&#xff0c;在此类安装中&#xff0c;远程设备播发其服务&#xff0c;并且计算机与之连接。 示例包括&#xff1a;鼠标、键盘和打印机&#xff1b;服务器端安装&#xff0c;在此类安装中&#xff0c;计算机播发服务…...

element表格有横向滚动条时产生错位或者偏移(火狐浏览器)

问题图 解决方法&#xff1a;给表头增加竖向滚动条的宽度 // 解决拖拽表格滚动条&#xff0c;错位问题 ::v-deep .el-table__header-wrapper{padding-right: 20px!important; // 滚动条宽度 }效果图如下&#xff1a;...

C# 下 SQLite 并发操作与锁库问题的 5 种解决方案

开篇&#xff1a;你是否被 SQLite 并发锁库困扰&#xff1f; 在当今数字化的时代浪潮中&#xff0c;数据已然成为了企业与开发者们手中最为宝贵的资产之一。C# 作为一门广泛应用于各类软件开发的强大编程语言&#xff0c;常常需要与数据库进行紧密交互&#xff0c;以实现数据的…...

2025封禁指定国家ip-安装xtables-addons记录

如何安装和使用 安装lux仓库(该仓库包含xtables-addons所需的依赖环境) # wget http://repo.iotti.biz/CentOS/7/noarch/lux-release-7-1.noarch.rpm # rpm -ivh lux-release-7-1.noarch.rpm 安装xtables-addons。注意&#xff1a;必须先安装kmod-xtables-addons&#xff0c;再…...

卷积神经02-CUDA+Pytorch环境安装

卷积神经02-CUDAPytorch环境安装 在使用Python进行pytorch的使用过程中遇到各种各样的版本冲突问题&#xff0c;在此进行记录 0-核心知识脉络 1&#xff09;根据自己电脑的CUDA版本安装对应版本的Pytorch&#xff0c;充分的使用GPU性能2&#xff09;电脑要先安装【CUDA ToolKi…...

高斯数据库与MySQL数据库的区别

高斯数据库与MySQL数据库的区别 在当今数据驱动的时代&#xff0c;选择合适的数据库管理系统&#xff08;DBMS&#xff09;对于项目的成功至关重要。高斯数据库和MySQL作为两款广泛使用的数据库系统&#xff0c;各自具有独特的特点和优势&#xff0c;适用于不同的应用场景。本…...

【 PID 算法 】PID 算法基础

一、简介 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#xff09;、Differential&#xff08;微分&#xff09;的缩写。也就是说&#xff0c;PID算法是结合这三种环节在一起的。粘一下百度百科中的东西吧。 顾名思义&#xff0c;…...

【AI】【RAG】如何通过WebUI部署与优化RAG问答系统

RAG(Retrieval-Augmented Generation)是一种通过知识库构建的问答系统,尽管它并非严格意义上的机器学习模型,但其高效构建专业问答体系的能力在实际应用中备受关注。本文将详细介绍如何通过WebUI部署RAG功能,以及提升RAG效果的关键技巧。 什么是RAG? RAG是一种结合检索技…...

SpringBoot之OriginTrackedPropertiesLoader类源码学习

源码解析 /*** 作用是从给定的资源&#xff08;如文件或输入流&#xff09;中加载 .properties 文件&#xff0c;* 并将属性键值对转换为带有来源信息&#xff08;origin&#xff09;的 OriginTrackedValue 对象。*/ public class OriginTrackedPropertiesLoader {private fin…...

51单片机 AT24C02(I2C总线)

存储器 随机存储 RAM 只读存储 ROM AT24C02芯片 是一种可以实现掉电不丢失的存储器&#xff0c;可用于保存单片机运行时想要永久保存的数据信息 存储材质&#xff1a;E2PROM 通讯接口&#xff1a;I2C总线 容量&#xff1a;256字节 I2C总线 一种通用的数据总线 两根通信线…...

Shell正则表达式与文本处理三剑客(grep、sed、awk)

一、正则表达式 Shell正则表达式分为两种&#xff1a; 基础正则表达式&#xff1a;BRE&#xff08;basic regular express&#xff09; 扩展正则表达式&#xff1a;ERE&#xff08;extend regular express&#xff09;&#xff0c;扩展的表达式有、?、|和() 1.1 基本正则表…...

Docker Desktop 中安装 MySQL 并开启远程访问的详细教程

是在 Docker Desktop 中安装 MySQL 并开启远程访问的详细教程&#xff1a; 一、安装 MySQL 容器 拉取 MySQL 镜像&#xff1a; docker pull mysql:latest这将从 Docker Hub 上拉取最新版本的 MySQL 镜像。如果你想使用特定版本的 MySQL&#xff0c;可以将 latest 替换为具体…...

计算机网络 (39)TCP的运输连接管理

前言 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;它在计算机网络中扮演着至关重要的角色。TCP的运输连接管理涉及连接建立、数据传送和连接释放三个阶段。 一、TCP的连接建立 TCP的连接建立采用三次握手机制&#xff0c;其过程如下&…...

麦田物语学习笔记:构建游戏的时间系统

基本流程 1.代码思路 (1)新建一个TimeManager.cs (2)创建枚举变量来表示四季,在TimeManager里需要的变量有: 游戏内的秒,分钟,小时,天,月,年;游戏内的季节;控制一个季节有多少个月;控制时间的暂停;计时器tikTime (3)在Settings里添加计时器的阈值,以及各个时间的进位 (4)初始化…...

Tauri教程-进阶篇-第二节 命令机制

“如果结果不如你所愿&#xff0c;就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持&#xff0c;而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第五章 Tauri的进阶教程 第二节…...

candb++ windows11运行报错,找不到mfc140.dll

解决问题记录 mfc140.dll下载 注意&#xff1a;放置位置别搞错了...