KY-RTI分布仿真技术:第八章 Visual C#程序设计

本文主要是介绍KY-RTI分布仿真技术:第八章 Visual C#程序设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第八章 Visual C#程序设计

       本章讲述如何基于Visual C#设计ping、pong程序。本质上是对上一章Visual C++程序的一次成功移植。对于不同的程序设计语言而言,基于HLA/RTI设计仿真应用的方法都差不多,而关键在于RTI软件能否支持相应程序设计语言的开发,用户关心一下调用接口即可,通过调用接口可以设计形式多样的程序。与C++调用接口的一个显著区别在于句柄和时间的表示,Visual C#中的各种句柄全部用int表示,各类时间则用double表示。Visual C#与Java编程风格相似,开发的仿真程序可以相互借鉴。

8.1需求分析

       开发2个程序,一个为ping,一个为pong;两者都不使用tick服务。

       这两个程序就像2个人打乒乓球一样,1个程序向另一个程序发送1个事件;另一个人收到事件后再给对方发送1个事件;如此循环往复。

8.2项目设计

       按照需求,将要开发的两个程序叫做ping-notick和pong-notick。该项目与时间无关,不需要时间管理服务。本项目采用交互类,并借用KY-RTI的bin目录下已有的chat.fed文件来传输交互。该交互类名为chat,有name和sentence两个参数,如下列代码所示。

class chat {           //交互类

       string  name;     //参数

       string  sentence; //参数

}

       在本项目中,两个程序的name分别设为“ping”和“pong”;sentence为要传输的字符串,其长度可变,具体的值由用户输入确定。

       在本项目中存在一个问题,两个程序总有一个程序先启动,另一个后启动;先启动的程序需要等待另一个程序启动后再协同仿真。基于KY-RTI开发的仿真成员是面向多线程的,主线程负责向RTI发送请求;回调线程负责从RTI接收请求。本项目让ping-notick先启动,通过一个布尔变量来确定回调线程是否收到了回调消息,当收到了第1个回调消息时,表明pong-notick也已经启动了;pong-notick也通过一个布尔变量来确定回调线程是否收到了回调消息。

8.3 ping-notick代码设计

       该程序由Program.cs和HwFederateAmbassador.cs两个文件组成。前者负责发送交互,后者负责从RTI接收交互,两者在执行时处于2个独立的线程中。在Program.cs中定义了2个类:Definitions和Program。Definitions类定义了一组静态变量,由主线程和回调线程共享,相当于C++语言中的全局变量,这与Java很像。

       Program.cs代码说明:

12-24行:定义Definitions类;

14行:定义变量STEP,用来表示发送多少次交互后仿真结束,初始值为100;

15行:发送1个交互时要传输的字节数;

19-21行:定义交互类及其参数句柄变量;

35-41行:输入要传输的字节数;

43-49行:输入要发送的交互数;

58-64行:创建联邦执行;

66-81行:加入联邦执行;

88-92行:获取交互类及其参数句柄;

95行:公布交互类,只有公布之后才能够向RTI发送交互;

97行:订购交互类,只有订购之后才能够从RTI收到其他人的聊天内容;

99-102行:根据要发送的字节数生成字符串;

104-113行:生成要传输的交互信息,将name和sentence打包,后面直接调用sendInteraction发送;

123-132行:循环操作,每次等待回调线程收到交互,然后发送1个交互;

131-133行:如果发送的交互数不等于接收的交互数,则循环等待;

144-153行:退出联邦执行,不再参加仿真;

162-175行:销毁联邦。如果是最后一个仿真成员执行该操作,则整个仿真结束。

                                                 表8.1  Visual C# ping-notick示例:program.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using RTI;
  6. using MID; //定义数据类型,例如HandleValuePair;
  7. using System.Threading; //for sleep
  8. using MYFED;
  9. namespace test
  10. {
  11. class Definitions
  12. {
  13.     public static int   STEP = 100;
  14.     public static int   data_size = 1024;
  15.     public static int   receivedInteractions = 0; //收到多少个交互
  16.     //定义交互类句柄和参数句柄
  17.     public static int   hChatClass = -1;    //对应chat.xml中的chat交互类
  18.     public static int   hChatName = -1;     //对应chat交互类的name参数
  19.     public static int   hChatSentence = -1; //对应chat交互类的sentence参数
  20.     public static bool received = false;    //收到1个交互
  21. }
  22. class Program
  23. {
  24.     static void Main(string[] args) {
  25.         RTI.RTIambassador rti = null;
  26.         string federationExecutionName = "chat";   //联盟名称
  27.         string  FEDfile = "chat.fed";               //FED文件
  28.         string  federateType = "ping";              //盟员名称
  29.         Console.WriteLine("请输入要传输的字节数:"); //pingpong要一致
  30.         Definitions.data_size = int.Parse(Console.ReadLine());
  31.         if (Definitions.data_size <= 0) {
  32.             Console.WriteLine("字节数不正确");
  33.             return;
  34.         }
  35.         Console.WriteLine("请输入交互次数:");      //pingpong要一致
  36.         Definitions.STEP = int.Parse(Console.ReadLine());
  37.         if (Definitions.STEP < 1) {
  38.             Console.WriteLine("交互次数不正确");
  39.             return;
  40.         }
  41.         try {
  42.             rti = new RTI.RTIambassador();                        // libRTI provided
  43.             MYFED.HwFederateAmbassador myfed = new MYFED.HwFederateAmbassador(); // User-defined
  44.             RTI.FederateAmbassador fedAmb = (RTI.FederateAmbassador)myfed;
  45.             int     federateId;
  46.             try {
  47.                 rti.createFederationExecution(federationExecutionName, FEDfile);
  48.             } catch ( RTI.FederationExecutionAlreadyExists ) {
  49.                 Console.WriteLine("FED_HW: Note: Federation execution already exists.");
  50.             } catch (Exception) {
  51.                 Console.WriteLine("FED_HW: ERROR: Failed to create federation execution.");
  52.             }
  53.             try {
  54.                 Console.WriteLine("FED_HW: JOINING FEDERATION EXECUTION: ");
  55.                 federateId = rti.joinFederationExecution( federateType,
  56.                              federationExecutionName,
  57.                              ref fedAmb);
  58.             } catch (RTI.FederateAlreadyExecutionMember) {
  59.                 Console.WriteLine("FED_HW: ERROR: federate already exists in the Federation Execution " + federationExecutionName+".");
  60.                 return;
  61.             } catch (RTI.FederationExecutionDoesNotExist) {
  62.                 Console.WriteLine("FED_HW: ERROR: Federation Execution does not exists.");
  63.                 return;
  64.             } catch (Exception) {
  65.                 Console.WriteLine("FED_HW: ERROR: Failed to join federation execution.");
  66.                 return;
  67.             }
  68.             Console.WriteLine("FED_HW: JOINED SUCCESSFULLY: : Federate Handle = " + federateId);
  69.             //
  70.             //获取交互类句柄
  71.             Definitions.hChatClass = rti.getInteractionClassHandle("chat");
  72.             //获取交互类参数句柄
  73.             Definitions.hChatName = rti.getParameterHandle("name", Definitions.hChatClass);
  74.             Definitions.hChatSentence = rti.getParameterHandle("sentence", Definitions.hChatClass);
  75.             //公布交互类,这样可以向RTI发送信息
  76.             rti.publishInteractionClass(Definitions.hChatClass);
  77.             //定购交互类,这样可以接受来自其它发布者的信息
  78.             rti.subscribeInteractionClass(Definitions.hChatClass);
  79.             string szSentence = "";
  80.             for(int i=0; i<Definitions.data_size; i++) {
  81.                 szSentence+="a";
  82.             }
  83.             HandleValuePair[] pParams = new HandleValuePair[2];
  84.             // Add Name
  85.             pParams[0] = new HandleValuePair();
  86.             pParams[0].aHandle = Definitions.hChatName;
  87.             pParams[0].aValue = federateType;
  88.             // Add Sentence
  89.             pParams[1] = new HandleValuePair();
  90.             pParams[1].aHandle = Definitions.hChatSentence;
  91.             pParams[1].aValue = szSentence;
  92.             for (int i = 0; i < Definitions.STEP; i++) {
  93.                 while (!Definitions.received) {
  94.                     Thread.Sleep(1);   //睡眠1豪秒
  95.                 }
  96.                 Definitions.received = false; //不要放到rti.sendInteraction之后
  97.                 //发送交互,所有定购者(不包括自己)都会在HwFederateAmbassador.cpp中的receiveInteraction服务中收到该交互。
  98.                 try {
  99.                     rti.sendInteraction(Definitions.hChatClass, pParams, "");
  100.                 } catch(Exception) {
  101.                     Console.WriteLine("error for send interaction");
  102.                 }
  103.             }
  104.             while (Definitions.STEP != Definitions.receivedInteractions) { //如果发送的交互数不等于接收的交互数,则循环等待
  105.                 Thread.Sleep(1000);   //睡眠1
  106.             }
  107.             //如果程序正常退出,则表明发送的交互数等于接收的交互数,没有丢失消息.
  108.         } catch (RTI.ConcurrentAccessAttempted e) {
  109.             Console.WriteLine(e.Message);
  110.             return;
  111.         } catch (Exception e) {
  112.                 Console.WriteLine("FED_HW: ERROR: this program meets an exception."+e.Message);
  113.             return;
  114.         }
  115.         try {
  116.             Console.WriteLine("FED_HW: RESIGN FEDERATION EXECUTION CALLED");
  117.             rti.resignFederationExecution(
  118.                 ResignAction.DELETEOBJECTSANDRELEASEATTRIBUTES);
  119.                  Console.WriteLine("FED_HW: SUCCESSFUL RESIGN FEDERATION EXECUTION CALLED");
  120.         } catch (Exception) {
  121.             Console.WriteLine("FED_HW: ERROR: resign federation execution");
  122.             return;
  123.         }
  124.         //------------------------------------------------------
  125.         // Destroy the federation execution in case we are the
  126.         // last federate. This will not do anything bad if there
  127.         // other federates joined.  The RTI will throw us an
  128.         // exception telling us that other federates are joined
  129.         // and we can just ignore that.
  130.         //------------------------------------------------------
  131.         try {
  132.             Console.WriteLine("FED_HW: DESTROY FEDERATION EXECUTION CALLED");
  133.             rti.destroyFederationExecution(federationExecutionName);
  134.                  Console.WriteLine("FED_HW: SUCCESSFUL DESTROY FEDERATION EXECUTION CALLED");
  135.         } catch (RTI.FederatesCurrentlyJoined) {
  136.             Console.WriteLine("FED_HW: FederatesCurrentlyJoined");
  137.             return;
  138.         } catch (RTI.FederationExecutionDoesNotExist) {
  139.             Console.WriteLine("FED_HW: FederationExecutionDoesNotExist");
  140.             return;
  141.         } catch (Exception) {
  142.             Console.WriteLine("FED_HW: ERROR: destroy federation execution");
  143.             return;
  144.         }
  145.     }
  146. }
  147. }

       HwFederateAmbassador.cs代码说明:

12-14行:由于不处理时间参数,因此如果接收到这种类型的receiveInteraction交互,则直接调用不带时间参数的服务来统一处理;

16-20行:通知主线程收到交互。

                                                 表8.2  Visual C#示例:HwFederateAmbassador.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using MID; //定义数据类型,例如HandleValuePair
  6. using test;
  7. namespace MYFED
  8. {
  9. public class HwFederateAmbassador : RTI.FederateAmbassador
  10. {
  11.     public override void receiveInteraction(int theInteraction, HandleValuePair[] theParameters, double theTime, string theTag, EventRetractionHandle theHandle) {
  12.         receiveInteraction(theInteraction, theParameters, theTag);
  13.     }
  14.     public override void receiveInteraction(int theInteraction, HandleValuePair[] theParameters, string theTag) {
  15.         Definitions.receivedInteractions++;
  16.         Console.WriteLine(Definitions.receivedInteractions+" received an interaction from pong");
  17.         Definitions.received = true;
  18.     }
  19. }
  20. }

8.4 pong-notick代码设计

       该程序由Program.cs和HwFederateAmbassador.cs两个文件组成。前者负责发送交互,后者负责从RTI接收交互,两者在执行时处于2个独立的线程中。在Program.cs中定义了2个类:Definitions和Program。Definitions类定义了一组静态变量,由主线程和回调线程共享,相当于C++语言中的全局变量,这与Java很像。

       Program.cs代码说明:

12-24行:定义Definitions类;

14行:定义变量STEP,用来表示发送多少次交互后仿真结束,初始值为100;

15行:发送1个交互时要传输的字节数;

19-21行:定义交互类及其参数句柄变量;

35-41行:输入要传输的字节数;

43-49行:输入要发送的交互数;

58-64行:创建联邦执行;

66-81行:加入联邦执行;

86-90行:获取交互类及其参数句柄;

93行:公布交互类,只有公布之后才能够向RTI发送交互;

95行:订购交互类,只有订购之后才能够从RTI收到其他人的聊天内容;

97-100行:根据要发送的字节数生成字符串;

102-111行:生成要传输的交互信息,将name和sentence打包,后面直接调用sendInteraction发送;

113-127行:循环操作,每次发送1个交互,然后等待回调线程收到交互;

129-131行:如果发送的交互数不等于接收的交互数,则循环等待;

142-151行:退出联邦执行,不再参加仿真;

160-173行:销毁联邦。如果是最后一个仿真成员执行该操作,则整个仿真结束。

                                                 表8.3  Visual C# pong示例:Program.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using RTI;
  6. using MID; //定义数据类型,例如HandleValuePair;
  7. using System.Threading; //for sleep
  8. using MYFED;
  9. namespace test
  10. {
  11. class Definitions
  12. {
  13.     public static int   STEP = 100;
  14.     public static int   data_size = 1024;
  15.     public static int   receivedInteractions = 0; //收到多少个交互
  16.     //定义交互类句柄和参数句柄
  17.     public static int   hChatClass = -1;    //对应chat.xml中的chat交互类
  18.     public static int   hChatName = -1;     //对应chat交互类的name参数
  19.     public static int   hChatSentence = -1; //对应chat交互类的sentence参数
  20.     public static bool  received = false;    //收到1个交互
  21. }
  22. class Program
  23. {
  24.     static void Main(string[] args) {
  25.         RTI.RTIambassador rti = null;
  26.         string federationExecutionName = "chat";   //联盟名称
  27.         string FEDfile = "chat.fed";                 //FED文件
  28.         string  federateType = "pong";               //盟员名称
  29.         Console.WriteLine("请输入要传输的字节数:"); //pingpong要一致
  30.         Definitions.data_size = int.Parse(Console.ReadLine());
  31.         if (Definitions.data_size <= 0) {
  32.             Console.WriteLine("字节数不正确");
  33.             return;
  34.         }
  35.         Console.WriteLine("请输入交互次数:");      //pingpong要一致
  36.         Definitions.STEP = int.Parse(Console.ReadLine());
  37.         if (Definitions.STEP < 1) {
  38.             Console.WriteLine("交互次数不正确");
  39.             return;
  40.         }
  41.         try {
  42.             rti = new RTI.RTIambassador();
  43.             MYFED.HwFederateAmbassador myfed = new MYFED.HwFederateAmbassador();
  44.             RTI.FederateAmbassador fedAmb = (RTI.FederateAmbassador)myfed;
  45.             int     federateId;
  46.             try {
  47.                 rti.createFederationExecution(federationExecutionName, FEDfile);
  48.             } catch ( RTI.FederationExecutionAlreadyExists) {
  49.                 Console.WriteLine("FED_HW: Note: Federation execution already exists.");
  50.             } catch (Exception) {
  51.                 Console.WriteLine("FED_HW: ERROR: Failed to create federation execution.");
  52.             }
  53.             try {
  54.                 Console.WriteLine("FED_HW: JOINING FEDERATION EXECUTION: ");
  55.                 federateId = rti.joinFederationExecution( federateType,
  56.                              federationExecutionName,
  57.                              ref fedAmb);
  58.             } catch (RTI.FederateAlreadyExecutionMember) {
  59.                 Console.WriteLine("FED_HW: ERROR: federate already exists in the Federation Execution " + federationExecutionName+".");
  60.                 return;
  61.             } catch (RTI.FederationExecutionDoesNotExist) {
  62.                 Console.WriteLine("FED_HW: ERROR: Federation Execution does not exists.");
  63.                 return;
  64.             } catch (Exception) {
  65.                 Console.WriteLine("FED_HW: ERROR: Failed to join federation execution.");
  66.                 return;
  67.             }
  68.             /
  69.             //获取交互类句柄
  70.             Definitions.hChatClass = rti.getInteractionClassHandle("chat");
  71.             //获取交互类参数句柄
  72.             Definitions.hChatName = rti.getParameterHandle("name", Definitions.hChatClass);
  73.             Definitions.hChatSentence = rti.getParameterHandle("sentence", Definitions.hChatClass);
  74.             //公布交互类,这样可以向RTI发送信息
  75.             rti.publishInteractionClass(Definitions.hChatClass);
  76.             //定购交互类,这样可以接受来自其它发布者的信息
  77.             rti.subscribeInteractionClass(Definitions.hChatClass);
  78.             string szSentence = "";
  79.             for(int i=0; i<Definitions.data_size; i++) {
  80.                 szSentence+="a";
  81.             }
  82.             HandleValuePair[] pParams = new HandleValuePair[2];
  83.             // Add Name
  84.             pParams[0] = new HandleValuePair();
  85.             pParams[0].aHandle = Definitions.hChatName;
  86.             pParams[0].aValue = federateType;
  87.             // Add Sentence
  88.             pParams[1] = new HandleValuePair();
  89.             pParams[1].aHandle = Definitions.hChatSentence;
  90.             pParams[1].aValue = szSentence;
  91.             for (int i = 0; i < Definitions.STEP; i++) {
  92.                 Definitions.received = false; //不要放到rti.sendInteraction之后
  93.                 //发送交互,所有定购者(不包括自己)都会在HwFederateAmbassador.cpp中的receiveInteraction服务中收到该交互。
  94.                 try {
  95.                     rti.sendInteraction(Definitions.hChatClass, pParams, "");
  96.                 } catch(Exception) {
  97.                     Console.WriteLine("error for send interaction");
  98.                 }
  99.                 while (!Definitions.received) {
  100.                     Thread.Sleep(1);   //睡眠1豪秒
  101.                 }
  102.             }
  103.             while (Definitions.STEP != Definitions.receivedInteractions) { //如果发送的交互数不等于接收的交互数,则循环等待
  104.                 Thread.Sleep(1000);   //睡眠1
  105.             }
  106.             //如果程序正常退出,则表明发送的交互数等于接收的交互数,没有丢失消息.
  107.         } catch (RTI.ConcurrentAccessAttempted e) {
  108.             Console.WriteLine(e.Message);
  109.             return;
  110.         } catch (Exception e) {
  111.             Console.WriteLine("FED_HW: ERROR: this program meets an exception."+e.Message);
  112.             return;
  113.         }
  114.         try {
  115.             Console.WriteLine("FED_HW: RESIGN FEDERATION EXECUTION CALLED");
  116.             rti.resignFederationExecution(
  117.                 ResignAction.DELETEOBJECTSANDRELEASEATTRIBUTES);
  118.             Console.WriteLine("FED_HW: SUCCESSFUL RESIGN FEDERATION EXECUTION CALLED");
  119.         } catch (Exception) {
  120.             Console.WriteLine("FED_HW: ERROR: resign federation execution");
  121.             return;
  122.         }
  123.         //------------------------------------------------------
  124.         // Destroy the federation execution in case we are the
  125.         // last federate. This will not do anything bad if there
  126.         // other federates joined.  The RTI will throw us an
  127.         // exception telling us that other federates are joined
  128.         // and we can just ignore that.
  129.         //------------------------------------------------------
  130.         try {
  131.             Console.WriteLine("FED_HW: DESTROY FEDERATION EXECUTION CALLED");
  132.             rti.destroyFederationExecution(federationExecutionName);
  133.                  Console.WriteLine("FED_HW: SUCCESSFUL DESTROY FEDERATION EXECUTION CALLED");
  134.         } catch (RTI.FederatesCurrentlyJoined /* e */ ) {
  135.             Console.WriteLine("FED_HW: FederatesCurrentlyJoined");
  136.             return;
  137.         } catch (RTI.FederationExecutionDoesNotExist) {
  138.             Console.WriteLine("FED_HW: FederationExecutionDoesNotExist");
  139.             return;
  140.         } catch (Exception) {
  141.             Console.WriteLine("FED_HW: ERROR: destroy federation execution");
  142.             return;
  143.         }
  144.     }
  145. }
  146. }

       HwFederateAmbassador.cs代码说明:

12-14行:由于不处理时间参数,因此如果接收到这种类型的receiveInteraction交互,则直接调用不带时间参数的服务来统一处理;

16-20行:通知主线程收到交互。

                                                 表8.4  Visual C# pong示例:HwFederateAmbassador.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using MID; //定义数据类型,例如HandleValuePair
  6. using test;
  7. namespace MYFED
  8. {
  9. public class HwFederateAmbassador : RTI.FederateAmbassador
  10. {
  11.     public override void receiveInteraction(int theInteraction, HandleValuePair[] theParameters, double theTime, string theTag, EventRetractionHandle theHandle) {
  12.         receiveInteraction(theInteraction, theParameters, theTag);
  13.     }
  14.     public override void receiveInteraction(int theInteraction, HandleValuePair[] theParameters, string theTag) {
  15.         Definitions.receivedInteractions++;
  16.         Console.WriteLine(Definitions.receivedInteractions + " received an interaction from ping");
  17.         Definitions.received = true;
  18.     }
  19. }
  20. }

8.5编译运行

       下面以Visual C# 2010为例说明编译运行过程。

       第1步:编译。以ping-notick程序为例说明,pong-notick程序的设置与此相同。

       (1)选择左侧“ping-notick”根节点,按右键选择“属性”,打开属性对话框。

                                                 图8.1 选择项目属性

       (2)设置项目属性。通常取缺省值,但也有用户可能有特殊要求。譬如,在Visual C# 2010下,KY-RTI为.Net Framework 3.5和.Net Framework 4两种目标框架提供支持。

                                                 图8.2 设置目标框架

       (3)添加引用。选择左侧“引用”节点,按右键选择“添加引用”。通过“浏览”找到KY-RTI\lib目录下的.dll文件,选择自己需要的.dll文件。

                                                 图8.3 添加引用

                                                 图8.4 浏览引用库

       第2步:编译,生成可执行程序。

       第3步:启动KY-RTI。注意,KY-RTI的IP地址和端口号要与RTI.rid一致。

       第4步:开启两个终端,分别运行ping-notick和pong-notick这2个仿真成员,开始仿真。如图8.5和图8.6所示。在这个例子中,每次传输的字节数为100个字节,一共来回10次。另外,基于Visual C#开发程序,则程序不需要调用tick服务,否则会有1个警告。

                                                 图8.5 ping-notick运行结果

                                                 图8.6 pong-notick运行结果

KY-RTI的Linux、Windows版本和源码请联系作者:walt_lbq@163.com

KY-RTI分布仿真技术:前 言

KY-RTI分布仿真技术:第一章 简介

KY-RTI分布仿真技术:第二章 系统安装

KY-RTI分布仿真技术:第三章 KY-OMT对象模型模板工具

KY-RTI分布仿真技术:第四章 C++程序设计

KY-RTI分布仿真技术:第五章 Qt程序设计

KY-RTI分布仿真技术:第六章 Java程序设计

KY-RTI分布仿真技术:第七章 Visual C++程序设计

KY-RTI分布仿真技术:第八章 Visual C#程序设计

KY-RTI分布仿真技术:第九章 综合演示

KY-RTI分布仿真技术:附录1 分组聊天(HLA数据分发管理的应用)

KY-RTI分布仿真技术:附录2 大联邦(构建1000个成员的HLA/RTI仿真系统)

KY-RTI分布仿真技术:附录3 国产化(操作系统+CPUs)

这篇关于KY-RTI分布仿真技术:第八章 Visual C#程序设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/499814

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变