金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 编程 > 删除图形,引用类型对象的深拷贝

删除图形,引用类型对象的深拷贝

发布时间:2019-10-28 22:03编辑:编程浏览(52)

    3. 设置图形的隐藏、显示

    【C#】

    using Spire.Xls;
    
    namespace HideShapes_XLS
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建实例,加载Excel文档
                Workbook workbook = new Workbook();
                workbook.LoadFromFile("test.xlsx");
    
                //获取第一个工作表
                Worksheet sheet = workbook.Worksheets[0];
    
                //隐藏第3个图形
                sheet.PrstGeomShapes[2].Visible = false;
                //显示图形
                //sheet.PrstGeomShapes[1].Visible = true;
    
                //保存并打开文档
                workbook.SaveToFile("HideShape.xlsx", ExcelVersion.Version2013);
                System.Diagnostics.Process.Start("HideShape.xlsx");
            }
        }
    }
    

    设置效果:

    图片 1

    进程结束信号 SIGTERM和SIGKILL的区别

    SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。

    对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里。

     

    值类型直接存储对象,而引用类型存储对象的地址,在对引用类型进行复制的时候,也只是复制对象的地址。

    2.提取图形中的文本和图片

    【C#】

    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Text;
    using Spire.Xls;
    using Spire.Xls.Core;
    
    namespace Extract_text_and_image_from_Excel_shape
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建实例,加载Excel工作表
                Workbook workbook = new Workbook();
                workbook.LoadFromFile("test.xlsx");
    
                //获取第一个工作表
                Worksheet sheet = workbook.Worksheets[0];
    
                //提取指定形状中的文本内容,并将提取到的文本保存到指定文档
                IPrstGeomShape shape1 = sheet.PrstGeomShapes[0];
                string s = shape1.Text;
                StringBuilder sb = new StringBuilder();
                sb.AppendLine(s);
                File.WriteAllText("ExtractText.txt", sb.ToString());
                System.Diagnostics.Process.Start("ExtractText.txt");
    
                //提取指定图形中的图片,并保存图片到指定文件
                IPrstGeomShape shape2 = sheet.PrstGeomShapes[3];
                Image image = shape2.Fill.Picture;
                image.Save("ShapeImage.png", ImageFormat.Png);
                System.Diagnostics.Process.Start("ShapeImage.png");
            }
        }
    }
    

    提取结果:

    图片 2

    使用信号需要特别注意的地方:

    如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。

    所以,尽量不要在多线程中使用信号。

    这个不妥,测试没发现有信号丢失

    例子演示:

    接收信号的程序,你会发现如果有另外一端使用多线程向这个进程发送信号,会遗漏一些信号。

     

    c#中的对象大体分为值类型和引用类型,值类型大致包括 int, string, struct等,引用类型大致包括 自定义Class,object 等。

    1. 绘制图形

    【C#】

    using System.Drawing;
    using Spire.Xls;
    using Spire.Xls.Core;
    
    namespace Add_shapes_to_Excel
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建实例
                Workbook workbook = new Workbook();
                //获取第一个工作表
                Worksheet sheet = workbook.Worksheets[0];
    
                //添加“太阳”形状的图形,并填充颜色
                IPrstGeomShape Triangle = sheet.PrstGeomShapes.AddPrstGeomShape(2, 2, 170, 160, PrstGeomShapeType.Sun);
                Triangle.Fill.ForeColor = Color.Orange;
                Triangle.Fill.FillType = ShapeFillType.SolidColor;            
                Triangle.Text = "IT'S A SUNNY DAY";//添加文本
    
                //添加“禁止”标志的图形,并填充渐变颜色
                IPrstGeomShape heart = sheet.PrstGeomShapes.AddPrstGeomShape(2, 7, 140, 140, PrstGeomShapeType.NoSmoking);
                heart.Fill.ForeColor = Color.Red;
                heart.Fill.FillType = ShapeFillType.Gradient;
    
                //添加云朵形状的图形
                IPrstGeomShape Cloud = sheet.PrstGeomShapes.AddPrstGeomShape(15, 2, 160, 160, PrstGeomShapeType.Cloud);           
                //设置图形阴影效果
                Cloud.Shadow.Angle = 90;
                Cloud.Shadow.Distance = 10;
                Cloud.Shadow.Size = 100;
                Cloud.Shadow.Color = Color.SteelBlue;
                Cloud.Shadow.Blur = 30;
                Cloud.Shadow.Transparency = 1;
                Cloud.Shadow.HasCustomStyle = true;
    
                //添加五角星形状的图形,并加载图片来填充图形
                IPrstGeomShape cloud = sheet.PrstGeomShapes.AddPrstGeomShape(15, 7, 160, 160, PrstGeomShapeType.Star5);
                cloud.Fill.CustomPicture(Image.FromFile("sm.png"), "sm.png");
                cloud.Fill.FillType = ShapeFillType.Picture;
    
                //保存并打开文档
                workbook.SaveToFile("AddShapes.xlsx", ExcelVersion.Version2013);
                System.Diagnostics.Process.Start("AddShapes.xlsx");
            }
        }
    }
    

    图形插入效果:

    图片 3

    发送信号一般有两种原因:

    1(被动式)  内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号

    2(主动式)  通过系统调用kill来向指定进程发送信号

     

     

    操作系统规定了进程收到信号以后的默认行为

    但是,我们可以通过绑定信号处理函数来修改进程收到信号以后的行为

    有两个信号是不可更改的SIGTOP和SIGKILL

    绑定信号处理函数:

     

    1.  

      import os

    2.  

      import signal

    3.  

      from time import sleep

    4.  

       

    5.  

      def onsignal_term(a,b):

    1.  

      print '收到SIGTERM信号'

    2.  

       

    3.  

      #这里是绑定信号处理函数,将SIGTERM绑定在函数onsignal_term上面

    1.  

      signal.signal(signal.SIGTERM,onsignal_term)

    2.  

       

    3.  

      def onsignal_usr1(a,b):

    1.  

      print '收到SIGUSR1信号'

    2.  

      #这里是绑定信号处理函数,将SIGUSR1绑定在函数onsignal_term上面

    1.  

      signal.signal(signal.SIGUSR1,onsignal_usr1)

    2.  

       

    3.  

      while 1:

    1.  

      print '我的进程id是',os.getpid()

    2.  

      sleep(10)

     

    运行该程序。然后通过另外一个进程来发送信号。

    发送消息的代码如下:

    1.  

      import os

    2.  

      import signal

    3.  

       

    4.  

      #发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改

    1.  

      os.kill(16175,signal.SIGTERM)

    2.  

      #发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改

    1.  

      os.kill(16175,signal.SIGUSR1)

    完全复制一个引用类型对象主要有几种方法:

    1.额外添加一个构造函数,入参为待复制对象(如果字段为引用类型,需要继续添加构造函数,这样情况会变的十分复杂。)

        public class Test1
        {
            private int field1;
            private int field2;
            private int field3;
            public Test1()
            { 
    
            }
    
            public Test1(Test1 test1)
            {
                this.field1 = test1.field1;
                this.field2 = test1.field2;
                this.field3 = test1.field3;
            }
        }
    

    2.利用序列化反序列化(对性能会有杀伤)

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                Test t1 = new Test();
                Console.WriteLine(t1.list.Count);
                Test t2 = (Test)Clone(t1);
                t2.list.Add("");
                Console.WriteLine(t2.list.Count);
                Console.WriteLine(t1.list.Count);
                Console.ReadLine();
            }
    
            public static object Clone(object obj)
            {
                BinaryFormatter bf = new BinaryFormatter();
                MemoryStream ms = new MemoryStream();
                bf.Serialize(ms, obj);
                ms.Position = 0;
                return (bf.Deserialize(ms)); ;
            }
        }
    
        [Serializable]
        public class Test
        {
            public List<string> list = new List<string>();
        }
    }
    

    3.利用反射(测试了一个网上的接口可用,但是对性能杀伤和序列化反序列化相当,而且对代码混淆有一定影响。   

    本文由金沙国际官网发布于编程,转载请注明出处:删除图形,引用类型对象的深拷贝

    关键词:

上一篇:没有了

下一篇:没有了