C#字体池技术实现代码详解
字体池的应用,主要是为了解决字体不断创建导致句柄泄漏/内存泄漏的问题,这个问题在Android上也同样存在。
经测试,C# WinForm原生控件不存在字体问题,但是使用的第三方控件Dev 14.1就存在这样的问题。
所以参照线程池思路,想到了使用字体池的方式,使系统中的字体统一为一个对象,经测试,有效解决了泄漏问题。
字体池代码:
/// <summary> /// 字体缓存类 /// </summary> public static class FontStatic { /// <summary> /// 缓存数组 /// </summary> private static Dictionary<string, Font> sFonts = new Dictionary<string, Font>(); /// <summary> /// 根据字体获取一个缓存的字体对象 /// </summary> /// <param name="font">字体</param> /// <returns>已缓存字体</returns> public static Font GetFont(Font font) { string key = string.Format("{0}-{1}-{2}-{3}", font.Name, font.Size, font.Italic, font.Bold); if (!sFonts.ContainsKey(key)) { sFonts.Add(key, font); } return sFonts[key]; } }
这里关键点在于判断需要创建的字体是否已存在缓存字典中,经过探索,不能使用Equals等方法,只能折中采用几个关键属性组合判断的方式
以上就是本次介绍的全部相关知识点,希望我们整理的内容能够帮助到大家。
相关推荐
-
C#字体池技术实现代码详解
字体池的应用,主要是为了解决字体不断创建导致句柄泄漏/内存泄漏的问题,这个问题在Android上也同样存在. 经测试,C# WinForm原生控件不存在字体问题,但是使用的第三方控件Dev 14.1就存在这样的问题. 所以参照线程池思路,想到了使用字体池的方式,使系统中的字体统一为一个对象,经测试,有效解决了泄漏问题. 字体池代码: /// <summary> /// 字体缓存类 /// </summary> public static class FontStatic { ///
-
使用 Opentype.js 生成字体子集的实例代码详解
字体子集是将字体文件中部分多余的字符删除,来减小文件大小,从而在 Web 端使用或嵌入到其他应用或系统中,在网上可以找到不少这方面的工具. Opentype.js是一套可以支持浏览器环境和 Node.js 环境的开源 OpenType 字体读写库,利用这个库可以很轻松实现浏览器环境和 Node.js 环境的字体子集功能. 在浏览器环境创建字体子集工具 首先创建一个简单的 HTML界面,包括一个选取字体文件按钮,一个输入框用于输入保留的字符,和一个保存下载按钮. HTML <!DOCTYPE ht
-
ADO.NET之连接池技术的使用详解
连接到数据库服务器通常需要一定的时间,且服务器也需要一定的资源来处理连接.Web应用程序有时处理成千上万的连接,需要相当多的资源来处理连接.ADO.NET具有连接池的特性,连接池的功能是保留一定数量的连接,当用户使用相同的连接字符串再次连接服务器时,ASO.NET将使用连接池中的连接而不用重新发起一次连接过程.当调用Close方法关闭连接时,ADO.NET将使用连接池中的连接而不用重新发起一次连接过程.当调用Close方法关闭连接时,连接将会返回到连接池中,下次再次调用Open方法时,将从连接池
-
python多进程使用及线程池的使用方法代码详解
多进程:主要运行multiprocessing模块 import os,time import sys from multiprocessing import Process class MyProcess(Process): """docstring for MyProcess""" def __init__(self, arg, callback): super(MyProcess, self).__init__() self.arg = a
-
vscode设置Fira_Code字体及改变编辑器字体、背景颜色的代码详解
一.设置Fira_Code字体 1.下载字体 这里给出github下载链接,点击链接后在README.md中的Download & Install一栏中即可下载,链接中也包括字体示例及介绍,可自行查看. Fira_Code字体下载 2,安装字体 下载并解压,进入里面的ttf文件夹,双击或右击后点击安装,里面包含六种样式,可以选择性安装或全安装即可. 3,设置vscode 打开vscode,点击左下角齿轮形状图标,选择settings,得到下图所示界面: 根据上图箭头所示依次点击Font,Edit
-
ActiveX控件的使用-js实现打印超市小票功能代码详解
·应客户的需求= = ,要在网页端实现打印小票的功能 ·先来一张打印出的小票效果图(合计明显不对,因为有修改订单功能,请各位忽略) 用什么方法实现呢: 我想应该是有三种吧 1.用第三方的浏览器控件(这个好似比较方便,我的老师也是这样建议我)向大家推荐一个 Lodop打印控件 2.用CSS写好模板,然后直接用页面打印的方法(应该是这样吧) 以上两种还没有尝试,这两天陆续尝试) 3.用微软自己的ActiveX控件(ActiveX控件可以实现调用本地的文件等操作(之前试过调用cmd,实现shutdow
-
Qt线程池QThreadPool的使用详解
目录 一.目的 二.最优线程数 三.线程池的原理 四.QThreadPool线程池 五.QThreadPool简单示例 一.目的 现在所有的高性能服务器程序,几乎都会使用到线程池技术,从而更好且有效的榨干服务器性能.而创建并销毁线程的过程势必会消耗内存.而在日常开发中内存资源是及其宝贵的,所以QT 多线程之线程池QThreadPool就有很大用处了.它可以用来管理线程的优先顺序,防止创建过多的线程,起到很好的管理作用. 二.最优线程数 线程的创建和销毁是有性能开销的,当我们有少量业务需要
-
SQL行转列和列转行代码详解
行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过了,却没有系统性的认识和总结过.为了加深认识,再总结一次. 行列互转,可以分为静态互转,即事先就知道要处理多少行(列);动态互转,事先不知道处理多少行(列). --创建测试环境 USE tempdb; GO IF OBJECT_ID('dbo.Orders') IS NOT NULL DROP TABLE dbo.Orde
-
Oracle分页查询性能优化代码详解
对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如此之多,就不得不对数据进行分页处理.常常用户并不是对所有数据都感兴趣的,或者大部分情况下,他们只看前几页. 通常有以下两种分页技术可供选择. Select * from ( Select rownum rn,t.* from table t) Where rn>&minnum and rn<=&maxnum 或者 Select * from ( Select rownum rn,t.* fro
-
java 可重启线程及线程池类的设计(详解)
了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的Thread,类似于如下形式: Thread t=new Thread(myRunnable).而最终使线程启动都是执行Thread类的start()方法. 在JAVA中,一个线程一旦运行完毕,即执行完其run()方法,就不可以重新启动了.此时这个线程对象也便成了无用对象,等待垃圾回收器的回收.下次
随机推荐
- JQuery+JS实现仿百度搜索结果中关键字变色效果
- C#将DataTable转化为List<T>
- PHP中常用的数组操作方法笔记整理
- 在MAC上搭建python数据分析开发环境
- 在Python中进行自动化单元测试的教程
- 一个字段同时满足多个条件的查询
- 一个js过滤空格的小函数
- css3元素简单的闪烁效果实现(html5 jquery)
- 经常腹胀怎么办?
- 浅析对Java关键字final和static的理解
- 有关div页面拖动、缩放、关闭、遮罩效果代码
- Python中动态检测编码chardet的使用教程
- c#利用webmail邮件系统发送邮件示例分享
- Java语言实现二叉堆的打印代码分享
- vue打包之后生成一个配置文件修改接口的方法
- pandas中去除指定字符的实例
- django云端留言板实例详解
- 详解vue几种主动刷新的方法总结
- Python实现base64编码的图片保存到本地功能示例
- js实现左右轮播图