4、C#进阶:MD5加密、进程、线程、GDI+、XML、委托

MD5加密

将字符串进行加密,无法解密。网上的解密方式也都是在库里找,找不到也没有。

 1 protected void Page_Load(object sender, EventArgs e)
 2 {
 3     string s = "123";
 4     Response.Write(getMd5(s));
 5 }
 6 public string getMd5(string str)
 7 {
 8     MD5 md5 = MD5.Create();//MD5抽象类无法实例化 实例化该方法
 9     byte[] buffer = Encoding.Default.GetBytes(str); //将字符串转换为字节数组
10     byte[] mdbuffer = md5.ComputeHash(buffer); //调用ComputeHash方法把数组传进去
11     //将字节数组中每个元素ToString();
12     StringBuilder result = new StringBuilder();
13     for (int i = 0; i < mdbuffer.Length; i++)
14     {
15         result.Append(mdbuffer[i].ToString("x2")); //ToString得到十进制字符串 ToString("x")十六进制字符串 ToString("x2")对齐
16     }
17     return result.ToString();
18 }

进制

表示某一位置上的数运算时是逢X进一位。二进制就是逢二进一, 十进制是逢十进一,十六进制是逢十六进一,以此类推.

so:二进制001010101只有0和1计算机中的数据都是二进制表示,四进制以0、1、2、3四个数字表示任何实数。十进制0~9数字组成,十六进制0~9以及ABCEDF组成(表示十进制数)10~15

ToString的特殊方法

时间:now.ToString("yyyy-MM-dd hh:mm:ss") 年-月-日 时:分:秒 具体可以自定单独写f y m d t 意义不同前者都可实现

字符型转换:int.ToString("n"); 640,000.00; int.ToString("C"); ¥640,000.00; .ToString("x");16进制

Directory类

用来操作文件夹的

 1 Directory.CreateDirectory("d:/ccc/cc"); //创建文件夹
 2 
 3 Directory.Delete("d:/ccc",true); //true删除非空文件夹
 4 
 5 Directory.Move(@"d:/ccc", @"d:/cccc"); //剪切操作 源目录没了 必须同一卷轴d盘
 6 
 7 string[] s = Directory.GetFiles(@"D:\项目\Web\Images\shiji"); //获得文件夹目录下所有文件全路径
 8 
 9 string[] s = Directory.GetFiles(@"D:\项目\Web\Images\shiji","*.jpg"); //获得文件夹目录下指定后缀名文件全路径
10 
11 string[] s = Directory.GetDirectories(@"D:\项目\Web\Images"); //获得文件夹目录下的文件夹的全路径
12 
13 Directory.Exists(@"D:\项目\Web\Images") //是否存在某文件夹

进程

我们可以把计算机中每一个运行的应用程序当作是一个进程

 1 ///获得当前程序中正在运行的进程
 2 Process[] pros = Process.GetProcesses();
 3 foreach (var item in pros)
 4 {
    //item.Kill(); //关闭所有进程.
    //item.ProcessName; //进程名
5 Console.Write(item.ToString()); 6 } 7 //通过进程打开一些程序 8 Process.Start("calc"); //打开计算器 9 Process.Start("notepad"); //打开记事本 10 //打开指定文件 11 ProcessStartInfo pro = new ProcessStartInfo(@"d:\11.txt"); 12 Process pr = new Process(); 13 pr.StartInfo = pro; 14 pr.Start();

线程

每一个进程是由多个线程组成的

单线程:让程序做多件事时,会引发卡死 假死状态。

多线程:让一个程序同时处理多个事情,后台运行程序,提高程序的运行效率。

前台线程:只有所有的前台线程都关闭才能完成程序关闭。(winform多窗口时)

后台线程:只要所有的前台线程结束,后台线程自动结束。

 1 //实例化Thread类,并传入一个指向线程所要运行的方法。(这时线程已经产生,但还没有运行)
 2 //调用Thread类的Start方法,标记线程可以被CPU执行了,但具体执行事件由CPU决定。
 3 Thread th = new Thread(Test); //创建一个线程去执行这个方法。
 4 th.IsBackground = true; //将线程设置为后台线程,前台关闭后 线程结束。
 5 th.Start(); //标记准备就绪,可以随意被执行,具体什么时候执行由CPU决定。
 6 //在.net下是不允许跨线程访问的。
 7 //有时候需要手动释放线程 关闭时 判断线程是否关闭 
 8 if (th != null)
 9 {
10     th.Abort(); //结束这个线程 不能再Start()
11 }
12 Thread.Sleep(3000); //睡眠3秒后执行
13 //线程执行带参数方法
14 Thread.Start("123"); object类型参数 在start后括号写参数

多用于大量数据时,多分一个线程去搜索数据,然后存储到缓存里,页面再用异步获取缓存中的数据。

GDI+

是一种绘图装置接口,可以用来绘制图片。

画直线

Graphics g = this.CreateGraphics(); //创建GDI对象
Pen pen = new Pen(Brushes.Yellow); //创建画笔
Point p1 = new Point(30, 50); //创建两个点
Point p2 = new Point(250, 250);
g.DrawLine(pen, p1, p2);

画验证码

 1 /// <summary>
 2 /// 字符
 3 /// </summary>
 4 /// <param name="len">几位</param>
 5 /// <returns></returns>
 6 public static string validation(int cd)
 7 {
 8     var ran = new Random();
 9     int num, tem;
10     string rtuStr = "";
11     for (int i = 0; i < cd; i++)
12     {
13         num = ran.Next();
14         if (i % 2 == 1)
15             tem = num % 10 + '0'; //数字
16         else
17             tem = num % 26 + 'A'; //字母
18         rtuStr += Convert.ToChar(tem).ToString();
19     }
20     //写入cookie
21     HttpCookie cookie = new HttpCookie("check");
22     cookie.Value = rtuStr.ToLower();
23     HttpContext.Current.Response.Cookies.Add(cookie);
24     return rtuStr;
25 }
26 
27 /// <summary>
28 /// 生成图像
29 /// </summary>
30 /// <param name="check">字符</param>
31 public static byte[] drawImg(string check)
32 {
33     Bitmap img = new Bitmap(90, 34);
34     var ht = Graphics.FromImage(img);
35     ht.Clear(Color.White);
36     ht.DrawLine(new Pen(Color.SpringGreen), 1, 1, 90, 34);
37     Font font = new Font("微软雅黑", 20, FontStyle.Bold);
38     var jianbian = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Teal, Color.Snow, 2f, true);
39     ht.DrawString(check, font, jianbian, 0, 0);
40     ht.DrawRectangle(new Pen(Color.Aqua), 0, 0, img.Width - 1, img.Height - 1);
41     MemoryStream ms = new MemoryStream();
42     img.Save(ms, ImageFormat.Jpeg);
43     ht.Dispose();
44     img.Dispose();
45     return ms.ToArray();
46 }

mvc中调用

1 public ActionResult ShowValidate()
2 {
3     var check = Common.Validate.validation(4);
4     byte[] buffer = Common.Validate.drawImg(check);
5     return File(buffer, "image/jpeg");
6 }

前台

<img src="/Login/ShowValidate" id="img" οnclick="changeCode()" class="validateImg">if (validateCode.toLowerCase() == getCode()) {return true;        
}        function changeCode() {$("#img").attr("src", $("#img").attr("src") + "?");
}function getCode() {var cookies = document.cookie.split(";");for (var i = 0; i < cookies.length; i++) {var validate = cookies[i].split("=");if (validate[0].replace(/(^\s*)|(\s*$)/g, "") == "check") {return validate[1].replace(/(^\s*)|(\s*$)/g,"");}}
}

XML文件

可扩展标记性语言,用来保存轻量级数据。

XML的标签是成对出现的、并且是区分大小写的。

XML文档必须包含根节点,且只有一个。

创建XML文件

 1 //创建XML对象
 2 XmlDocument doc = new XmlDocument();
 3 //创建文档描述信息
 4 XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
 5 doc.AppendChild(dec);
 6 
 7 //创建根节点
 8 XmlElement books = doc.CreateElement("Books");
 9 doc.AppendChild(books);
10 
11 //创建子节点
12 XmlElement book1 = doc.CreateElement("Book");
13 books.AppendChild(book1); //将子节点添加到books
14 
15 //给book1子节点追加子节点
16 XmlElement name1 = doc.CreateElement("Name");
17 name1.InnerText = "c#"; //赋值 文本值
18 book1.AppendChild(name1);
19 
20 XmlElement price1 = doc.CreateElement("Price");
21 price1.InnerXml = "<b>10.0</b>"; //赋值 html标签
22 book1.AppendChild(price1);
23 
24 XmlElement items = doc.CreateElement("Items");
25 //给节点增加属性
26 items.SetAttribute("Name", "c#");
27 items.SetAttribute("Price", "10.0");
28 book1.AppendChild(items);
29 
30 doc.Save("Books.xml"); //保存
31 
32 //创建后
33 <?xml version="1.0" encoding="utf-8"?>
34 <Books>
35   <Book>
36     <Name>c#</Name>
37     <Price>
38       <b>10.0</b>
39     </Price>
40     <Items Name="c#" Price="10.0" />
41   </Book>
42 </Books>

向已有XML文件中追加

1 XmlDocument doc = new XmlDocument();
2 if (File.Exists("Books.xml"))
3 {
4     doc.Load("Books.xml"); //加载 xml
5     XmlElement books = doc.DocumentElement; //得到根节点
6     //再建立元素进行追加
7 }

获取XML文件

 1 XmlDocument doc = new XmlDocument();
 2 doc.Load("Books.xml");
 3 
 4 XmlElement books = doc.DocumentElement;
 5 XmlNodeList xnl = books.ChildNodes; //得到所有节点
 6 
 7 foreach (XmlNode v in xnl) //遍历得到所有节点值
 8 {
 9     Console.WriteLine(v.InnerText);
10 }
11 
12 XmlNodeList xnl1 = doc.SelectNodes("Books/Book/Items"); //查找节点列表
13 foreach (XmlNode node in xnl1)
14 {
15     Console.WriteLine(node.Attributes["Name"].Value); //得到name属性的值
16     Console.WriteLine(node.Attributes["Price"].Value); //得到price属性的值
17 }

删除XML文件

1 XmlDocument doc = new XmlDocument();
2 doc.Load("Books.xml");
3 
4 XmlNode xnl = doc.SelectSingleNode("Books/Book"); //查找单一节点
5 xnl.RemoveAll(); //删除全部
6 doc.Save("Books.xml");
7 Console.ReadKey();

LinqToXml

 1 //兼容传统方法创建
 2 XDocument xDoc = new XDocument();
 3 //xDoc.Declaration = new XDeclaration() 默认UTF-8 第一行不需要单独建
 4 XElement xRoot = new XElement("root", "值"); //定义元素
 5 
 6 XElement xRoot1 = new XElement("root1");  //定义元素2
 7 xRoot1.Value = "值1";
 8 
 9 XAttribute xattr = new XAttribute("Id", "1"); //定义属性
10 
11 xDoc.Add(xRoot); //统一使用add添加
12 xRoot.Add(xattr);
13 
14 xDoc.Save(@"d:\linqtoxml.xml");
15 
16 //真正的linq语法
17 //F#  函数式编程语言
18 new XDocument(
19     new XElement("root",
20         new XAttribute("id", "001"),
21         "值")
22     ).Save(@"d:\2.xml");
23 //链式编程,流水线生产 f1().f2().f3()...
24 
25 //查找xml
26 XDocument xdoc = new XDocument(new XElement("root"));//根节点
27 xdoc.Root.Add(new XElement("person",
28     new XAttribute("id", "1"),
29     new XAttribute("name", "zhangsan"),
30     new XAttribute("sex", "1")
31     )); //添加子节点
32 xdoc.Root.Add(new XElement("person",
33    new XAttribute("id", "2"),
34    new XAttribute("name", "lisi"),
35    new XAttribute("sex", "2")
36    ));
37 xdoc.Save(@"d:\2.xml");
38 
39 <?xml version="1.0" encoding="utf-8"?>
40 <root>
41   <person id="1" name="zhangsan" sex="1" />
42   <person id="2" name="lisi" sex="2" />
43 </root>
44 
45 //开始查找、修改、删除
46 
47 XDocument xdoc = XDocument.Load(@"d:\2.xml"); //加载xml
48 foreach (XElement xlt in xdoc.Root.Elements()) //Root根节点 Elements 元素集合
49 {
50     if (xlt.Name.LocalName == "person") //Name节点名 LocalName不带命名空间的节点名
51     {
52         if (xlt.Attribute("id").Value == "1") //判断属性值为1时
53         {
54             Response.Write(xlt.Attribute("name").Value); //输出name
55             xlt.Attribute("name").Value = "newname"; //修改name
56             xlt.Remove(); //删除此节点
57             xdoc.Save(@"d:2.xml");
58         }
59     }
60 }
61 
62 //Linq查询语法
63 //Descendants()所有子节点 可加某节点下所有节点
64 var query = from s in xdoc.Descendants() //从集合里找 
65             where s.Name.LocalName == "person"
66             select s;
67 foreach (XElement xlt in query)
68 {
69     Response.Write(xlt.Value);
70 }
71 
72 //Linq方法语法(lambda表达式)
73 foreach (XElement xlt in xdoc.Descendants().Where(s =>
74 {
75     if (s.Name.LocalName == "name")
76     {
77         return true;
78     }
79     return false;
80 }))
81 {
82     Response.Write(xlt.Value);
83 }

委托
使用delegate定义委托,将一个方法作为参数传给另一个方法。
委托所指向的函数必须返回值与参数相同

  1 /// <summary>
  2 /// 委托语法
  3 /// </summary>
  4 class Program
  5 {
  6     public delegate void delSayhi(string name); //定义委托
  7     static void Main(string[] args)
  8     {
  9         delSayhi del = new delSayhi(sayHiChinese); //实例化委托调用具体方法
 10         del("san"); //执行
 11 
 12         delSayhi del1 = sayHiChinese; //直接赋值方式
 13         del1("si");
 14 
 15         //匿名函数
 16         delSayhi del2 = delegate(string name) { Console.WriteLine(name + ",思密达"); };
 17         del2("韩国");
 18 
 19         //lambda表达式  ()没参数也要写 => { //方法体 } 没参数可以e=> Console.WriteLine(""); 如果只有一句话不用{} 返回的return可以省略
 20         delSayhi del3 = (string name) => { Console.WriteLine(name + ",萨瓦迪卡"); };
 21         del2("泰国");
 22 
 23         sayHi("david", sayHiEnglish); //调用自定义方法 参数要调用的方法
 24         Console.ReadKey();
 25     }
 26 
 27     public static void sayHi(string name, delSayhi del) //定义方法 类型委托
 28     {
 29         del(name);
 30     }
 31 
 32     public static void sayHiChinese(string name)
 33     {
 34         Console.WriteLine("你好, 我叫" + name);
 35     }
 36     public static void sayHiEnglish(string name)
 37     {
 38         Console.WriteLine("hello, my name is {0}, nice to meet you!", name);
 39     }
 40 }
 41 
 42 
 43 
 44 /// <summary>
 45 /// 求任意数组最大值
 46 /// </summary>
 47 class Program
 48 {
 49     public delegate int delCompre(object o1, object o2); //定义比较委托
 50     static void Main(string[] args)
 51     {
 52         //比较int
 53         object[] objs = new object[] { 1, 2, 3, 4, 5, 32, 1, 243, };
 54         var max = getMax(objs, getIntMax); //传入比较int方法
 55         Console.WriteLine(max);
 56 
 57         var max2 = getMax(objs, delegate(object o1, object o2)
 58         {
 59             return int.Parse(o1.ToString()) - int.Parse(o2.ToString());
 60         }); //匿名函数 与比较int一样
 61         Console.WriteLine(max2);
 62 
 63         //比较string
 64         object[] strs = new object[] { "abc", "efd", "asdf", "sd", "asdff" };
 65         var maxstrs = getMax(strs, delegate(object o1, object o2)
 66         {
 67             return o1.ToString().Length - o2.ToString().Length;
 68         }); //匿名函数
 69         Console.WriteLine(maxstrs);
 70 
 71         var maxstrs2 = getMax(strs, (object o1, object o2) =>
 72         {
 73             return o1.ToString().Length - o2.ToString().Length;
 74         }); //lambda 表达式
 75         Console.WriteLine(maxstrs2);
 76 
 77         Console.ReadKey();
 78     }
 79 
 80     public static int getIntMax(object o1, object o2) //比较int方法
 81     {
 82         int n1 = int.Parse(o1.ToString());
 83         int n2 = int.Parse(o2.ToString());
 84         return n1 - n2;
 85     }
 86     /// <summary>
 87     /// 取一个任意数组的最大值
 88     /// </summary>
 89     /// <param name="objs">数组</param>
 90     /// <param name="del">委托</param>
 91     /// <returns></returns>
 92     public static object getMax(object[] objs, delCompre del)
 93     {
 94         object max = objs[0];
 95         for (int i = 0; i < objs.Length; i++)
 96         {
 97             //if (max < objs[i]) object 无法确定是什么类型 所以不能用<
 98             if (del(max, objs[i]) < 0) //如果委托值小于0 成立 传入如何比较即可
 99             {
100                 max = objs[i];
101             }
102         }
103         return max;
104     }
105 }
106 
107 
108 /// <summary>
109 /// 泛型<T>委托
110 /// </summary>
111 class Program
112 {
113     public delegate int delCompre<T>(T t1, T t2); //定义泛型委托
114     static void Main(string[] args)
115     {
116         //int
117         int[] nums = { 1, 2, 3, 4, 5 };
118         int max = getMax<int>(nums, (int t1, int t2) => { return t1 - t2; });
119         Console.WriteLine(max);
120 
121         //string
122         string[] strs = { "asd", "sdf", "zxcvv", "123", "qwe" };
123         string maxStr = getMax(strs, (string s1, string s2) => { return s1.Length - s2.Length; });
124         Console.WriteLine(maxStr);
125 
126         Console.ReadKey();
127     }
128 
129     public static T getMax<T>(T[] objs, delCompre<T> del)
130     {
131         T max = objs[0];
132         for (int i = 0; i < objs.Length; i++)
133         {
134             if (del(max, objs[i]) < 0)
135             {
136                 max = objs[i];
137             }
138         }
139         return max;
140     }
141 }

多播委托
注册多个方法,调用时将这些方法依次执行一遍。

1 public delegate void my1();
2 
3 my1 my = Fun1();
4 my+= Fun2(); //+=实现多播委托
5 
6 public static void Fun1(){
7 }
8 public static void Fun2(){
9 }  

转载于:https://www.cnblogs.com/baidawei/p/4705392.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LwIP tcp/ip socket编程listen函数分析

函数原型为&#xff1a;[cpp] view plaincopyint listen(int sockfd, int backlog); <span style"font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">//成功返回0&#xff0c;失败返回-1</span> 下面只讨论TCP UD…

[react] React如何进行代码拆分?拆分的原则是什么?

[react] React如何进行代码拆分&#xff1f;拆分的原则是什么&#xff1f; 这里我认为react的拆分前提是代码目录设计规范&#xff0c;模块定义规范&#xff0c;代码设计规范&#xff0c;符合程序设计的一般原则&#xff0c;例如高内聚、低耦合等等。 在我们的react项目中&am…

《深入理解Linux内核》笔记5:内存管理

本文介绍内核如何给自己分配物理内存并管理。对应《深入》第8章。 在《深入》第2章“内存寻址”&#xff08;或者是我博客中的这篇文章&#xff0c;点这里&#xff09;中&#xff0c;已经介绍了内核如何给自己分配1G的线性地址的。但是物理内存的分配及管理恐怕更复杂而且更有必…

Qt 设置指定列数显示

一、需求 将由string生成的ByteArry打印到textEdit中&#xff0c;指定显示的列数。 二、代码 void MainWindow::on_pushButton_convert_clicked() { QString Str ui->textEdit_string->toPlainText(); int Strszie Str.length(); QString Showstr"";…

Objective-C设计模式——单例Singleton(对象创建)

单例 和其它语言的单例产不多&#xff0c;可以说是最简单的一种设计模式了。但是有几个点需要注意下&#xff0c;单例就是一个类只有一个实例。 所以我们要想办法阻止该类产生别的实例&#xff0c;一般语言中都会将构造函数写为private。但是OC中的函数并没有限定符&#xff0c…

基于SSM在线协同过滤汽车推荐销售系统

SSM毕设分享 基于SSM在线协同过滤汽车推荐销售系统 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数&#xff1a;3分 工作…

Keil中的Code,RO,RW,ZI分别表示什么?

在使用keil开发STM32应用程序时&#xff0c;点击Build后在Build Output窗口中经常会有如下信息&#xff1a;以前一直好奇这几个参数和实际使用的STM32芯片中Flash和SRAM的对应关系&#xff0c;于是上网搜了一圈&#xff0c;做如下总结&#xff1a;这些参数的单位是Byte图中几个…

linux mmap 内存映射 mmap() vs read()/write()/lseek()

From: http://www.perfgeeks.com/?p723 通过strace统计系统调用的时候&#xff0c;经常可以看到mmap()与mmap2()。系统调用mmap()可以将某文件映射至内存(进程空间)&#xff0c;如此可以把对文件的操作转为对内存的操作&#xff0c;以此避免更多的lseek()与read()、write()操作…

[react] React组件的构造函数是必须的吗?

[react] React组件的构造函数是必须的吗&#xff1f; 构造函数并不是必须的,对于无状态组件&#xff0c;内部没有维护自己的state&#xff0c;只接收外部传入的props 是不需要声明构造函数的 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#x…

为什么dos下的com文件都要org 0100h呢?为什么系统启动时要org 07c00h呢

这是因为 .com 载入内存后的起始偏址就是100h. 前面的100h字节是该程序的PSP 部分. 所以, 为了程序中对地址引用的正确, 必需加上org 100h语句。----------------------------------------------------------------------------------------------------------------…

Qt中的TableWidget初始化表头、行高、选中、自动扩展和接受修改

一、需求 设置QT中的TableWidget样式&#xff0c;初始化表头&#xff0c;行高和颜色&#xff0c;行选中&#xff0c;是否修改&#xff0c;是否自动扩展宽度等。 二、代码 void MainWindow::TimerListInit() {QStringList InfHeader;int columnNum;columnNum 7;ui->table…

JTAG、SWD接口定义

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明。 博客已转到 http://blog.csdn.net/upc_xbt https://blog.csdn.net/u014124220/article/details/50829713Jlink仿真器接口仿真器端口连接目标板备注1. VCCMCU电源VCCVCC2. VCCMCU电源VCCVCC3. TRSTTRSTTest ReS…

[leedcode 215] Kth Largest Element in an Array

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example,Given [3,2,1,5,6,4] and k 2, return 5. Note: You may assume k is always valid, 1 ≤ k ≤ arrays lengt…

Ubuntu 修改默认的PDF打开方式

Ubuntu自带了可以打开PDF的文档编辑器&#xff0c;如GIMP和文档查看器&#xff0c;但这些自带的文档编辑器并不是很好用&#xff0c;很可能会产生乱码&#xff0c;以至于不方便…… 由于在WIN下对foxit的产品感觉很满意&#xff0c;并且知道它也为linux做了一个PDF查看器&#…

[react] React组件的构造函数有什么作用?

[react] React组件的构造函数有什么作用&#xff1f; 在react的新的写法中&#xff0c;每一个组件都是一个类&#xff0c;这个很符合es6的语法规范&#xff0c;在es6中要想创建一个对象&#xff0c;就要调用相应的构造函数, react的组件渲染有两种情况&#xff0c;第一种情况是…

高级Linux程序设计第五章:进程间通信

From: http://www.cnblogs.com/forfuture1978/archive/2010/04/29/1723417.html 五种进程间通信的方式&#xff1a; 共享内存(shared memory)&#xff1a;其允许多个进程通过读写同一块内存地址来相互通信。 内存映射(Mapped memory)&#xff1a;其和共享内存相似&#xff0c;…

Qt 给应用程序添加图标

一、需求 给应用程序.exe添加图标。 二、代码 1、资源文件中添加进去main.ico 32X32pt 2、xxxx.pro文件中 添加RC_ICONS main.ico

#pragma pack(push,1)与#pragma pack(1)的区别

这是给编译器用的参数设置&#xff0c;有关结构体字节对齐方式设置&#xff0c; #pragma pack是指定数据在内存中的对齐方式。#pragma pack (n) 作用&#xff1a;C编译器将按照n个字节对齐。#pragma pack () 作用&#xff1a;取消自定义字节对齐方式…

Drainage Ditches - poj 1273(网络流模板)

题意&#xff1a;1是源点&#xff0c;m是汇点&#xff0c;求出来最大流量&#xff0c;没什么好说的就是练习最大流的模板题 ************************************************************** 先用Edmonds-Karp的算法做一下试试吧重边贡献了 1W&#xff0c;要加上所有的重边才算…

sawmill全方位日志分析大师

Sawmill 是一套崭新的集中式(中文)日志报表系统&#xff0c;除了提供收集设备或服务的日志&#xff0c;整合、分析成有效报表外&#xff0c;并能降低企业成本与信息管理人员减少学习报表时间&#xff0c;且能于全球各地上网即可获得IT信息。 集中式 &#xff1a; 集中整合各式设…