2022-11-08 17:01:38
基础布局网上有的是,不再赘述,在此仅描写一些犄角噶蓝儿,不容易查到,但会遇到的问题:1,假设共3个区域,想让布局显示方式为左侧一个区域,右侧呈上下区域。通过dockpanel.show(参数)逐一show出来,结果却发现可能布局与自己想象的不一致。结果布局可能为上一个区域,左右两个区域的这种布局,图:,解决方案:改变代码show的顺序即可。图:2,点击首页按钮,自动在document区域新增首页。...
2022-11-06 15:46:50
一般测量时间间隔使用的是DateTime.Now实例的DateTime.Ticks当前属性,想要精确测量一个操作的运行时间就只能使用Stopwatch类计时了。Stopwatch计时精度取决于硬件,如果安装的硬件和操作系统支持高分辨率性能计数器, 则Stopwatch类将使用该计数器来测量运行时间。,否则,Stopwatch类将使用系统计时器来测量运行时间。测量耗时操作的运行时间:...
2022-11-06 09:59:27
勇哥注:
这个系列是勇哥的小娱乐。这么多年来感觉自己就是工作机器,没有一点属于自己的乐子。
突然想到儿时的小梦想是写个fc的坦克大战。要不,先弄个AI,让它自动玩坦克大战吧。fc的坦克大战是fc模拟器的游戏,要做自动打怪的AI,可以考虑连续窗口截图,然后交由halcon进行处理。处理结果交由策略代码处理,最后发布手柄控制指令。因此,首先先要考虑窗口的连续帧如何实时截取,然后就是如何实现虚拟...
2022-11-02 19:40:17
勇哥注:我们继续上一篇《C# 勇哥关于多线程读写plc内存的研究续,解决lock锁的效率问题》上一篇我们解决了lock锁的效率问题。本节我们继续讨论一下控件读写的效率问题。由下图中,我们看到的RichTextBox.SetText,它占6.44%的效率。本着程序员的工匠精神,我们也要把这部分耗能解决掉。直接说答案:我们在上节代码中,使用了Invoke输出RichTextBox的文本。也就是使用委托...
2022-11-02 11:52:28
勇哥注:ConcurrentBag是一个线程安全的无序集合。专为生产消费模式进行订制的集合。如果多线程使用List<T>就会遇到问题:System.InvalidOperationException:“集合已修改;可能无法执行枚举操作。”。原因是timer2在遍历list的过程当中,timer1修改了list,使其大小发生了变化。如果使用ConcurrentBag这类安全集合,可以避免...
2022-11-01 21:57:22
勇哥注:我们继续上一篇《勇哥关于多线程读写plc内存的研究》在上篇结尾,我们看到lock锁带来的效率问题。本着程序员应有的工匠精神,本节我们来研究并解决这个问题。先回顾一下上篇文章结尾勇哥截的程序效率图。Monitor.Enter的函数占用cpu时间75.85%,此耗能大户就是lock锁。(因为lock关键字实际上是Monitor的语法糖)由于plc读写操作中,读的次数一定远大于写入的次数,因此我...
2022-11-01 21:49:45
这篇文章向大家介绍了读写锁ReaderWriterLockSlim,其优点就是多个线程可以同时读取该对象,要了解更多读写锁的知识,仔细阅读下文吧读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能。某些场合下,对一个对象的读取次数远远大于修改次数,如果只是简单的用loc...
2022-08-03 15:20:30
版本要求: netMarketing1.4.0命名空间:netMarketing.Net.SocketLibrary客户端调用示例:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace S...
2022-07-03 22:04:16
开源的统计图控件中基本常用的是OpenFlashChar和ZedGraph,今天就先来讲讲ZedGraph的使用。ZedGraph资源ZedGraph来源:http://sourceforge.net/project/showfiles.php?group_id=114675ZedGraph相关例子资源:http://zedgraph.org/wiki/index.php?title=Sample...
2022-06-10 15:56:50
单例模式是软件工程学中最富盛名的设计模式之一。从本质上看,单例模式只允许被其自身实例化一次,且向外部提供了一个访问该实例的接口。通常来说,单例对象进行实例化时一般不带参数,因为如果不同的实例化请求传递的参数不同的话会导致问题的产生。(若多个请求都是传递的同样的参数的话,工厂模式更应该被考虑)C#中实现单例有很多种方法,本文将按顺序介绍非线程安全、完全懒汉式、线程安全和低/高性能集中版本。在所有的实...
2022-05-29 23:04:30
项目结构是这样的但是重新编译的时候报下面的错误:检查了各个类的依赖关系,以及出现感叹号的失效引用项目。还是不行。真是非常的奇怪。后回忆起添加了一个项目CMemeShare到ShareClass类中去。因为之前是个项目,所以有自己 的bin, property等目录,将其删除,重新编译就好了。--------------------- 作者:hackpig来源:www.skcircle.com版权声...
2022-04-11 11:11:39
引言:勇哥手里的运控软件对实时性有了新要求。因为同设备上运行的其它视觉软件对cpu时间有变态的占用,压缩了运控软件的cpu占用时间。我们知道如果视觉软件卡一下,最多是处理时间长一点,但是运控软件卡一下,那就意味着撞机的问题,这个要严重得多。这个问题会持续把研究结果更新到本贴子。(一)提升线程和进程的优先级别ProcessPriorityClass等级说明public enum ProcessPri...
2021-10-17 09:27:15
请看演示程序。我们知道List.Find() 如果找到则返回这个对象,找不到返回这个类型的缺省值。下面例子中,你无法这样写: if(res1==null) { }因为结构体的缺少值不是null。演示程序:using System;
using System.Collections.Generic;
using System.Li...
2021-10-03 21:14:44
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。const string mutexName = "勇哥";public static Mutex mutexObj = new Mutex(false, mutexName); 定义了一个全局锁,false表示创建互斥锁之后持有状态是:没有人持有命名“勇哥”,将做为全局的操作系统互斥量...
2021-09-30 08:22:25
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。先看源码:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using S...
2021-09-28 20:43:04
一、栈和堆是什么程序运行时,它的数据必须存储在内存中。一个数据项需要多大的内存、存储在什么地方、以及如何存储都依赖于该数据项的类型。运行中的程序使用两个内存区域来存储数据:栈和堆。1、栈栈是一个内存数组,是一个LIFO(last-in first-out,后进先出)的数据结构。栈存储几种类型的数据:某些类型变量的值、程序当前的执行环境、传递给方法的参数。栈的特点:(1)数据只能从栈的顶端插入和删除...
2021-09-28 20:40:51
引用类型如:string,Object,class等总是在从托管堆上分配的,C#中new操作符返回对象的内存地址--也就是指向对象数据的内存地址。以下是值类型与引用类型的表: 我们来看下面一段代码:首先在类中声明一个class类,和一个struct结构,如图:并使用在程序入口调用它们,如图: 现在我们来看一看,它们在内存当中是如何存储的? 从这张图可以看出,class(类)实例化出来的对象,指向...
2021-09-28 20:22:28
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。上节说到lock锁关键字,它实际上是Monitor的语法糖。lock锁定的是一个内存地址的引用。lock必须锁定一个引用类型的变量。锁定的变量msdn推荐是下面这样的:private static readonly object lockobj = new object();这里为什么必须这样是有玄机的。我们...
2021-09-28 18:52:23
作为多线程和并行计算不得不考虑的问题就是临界资源的访问问题,解决临界资源的访问通常是加锁或者是使用信号量,这个大家应该很熟悉了。 而集合作为一种重要的临界资源,通用性更广,为了让大家更安全的使用它们,微软为我们带来了强大的并行集合:System.Collections.Concurrent里面的各位仁兄们。 首先,咱们从一个经典的问题谈起。生产者消费者问题 这个问题是最为经典的多线程应用问...
2021-09-28 14:47:04
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。程序如下: private void button1_Click(object sender, EventArgs e)
{
var list1 = new List<int>();
for(int i=0;i<10000...
2021-09-28 14:17:17
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。运行源码后,执行button1 for (int i = 0; i < 5; i++)
{
var k = i;
//加上下面这句效果又不一样
Task.Run((...
2021-09-25 16:51:17
勇哥注:关注这个话题是因为看到C#的关键字 lock时,其传入引用对象。因为string也是引用对象,所以能否做为lock的参数?对于这个问题,要搞明白C#的字符串的一个特点,它使用类似于享元模式的机制。因此在lock中锁字符串是相当不安全的。下面贴子是对C#字符串与享元模式的深入讨论。写这个文章,主要是因为网上对C#字符串和享元模式的误解比较多。Flyweight模式先说这名字,fly呢,就是苍...
2021-09-22 10:28:23
勇哥手里一个无刷电机,采用485的modelbus crc16协议来控制。因此需要一个计算校验和的工具。源码:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
us...
2021-09-17 16:13:16
勇哥注:此文转载自:https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-net-8-best-practices/任何从事过大型企业项目的人都知道内存泄漏就像大酒店里的老鼠。当它们很少时,您可能不会注意到,但是您必须始终保持警惕,以防它们人口过多,闯入厨房并在所有东西上大便。查找、修复和学习避免内存泄漏是一项重要技...
2021-09-17 11:02:46
1. 什么是.Net内存泄露(1).NET 应用程序中的内存您大概已经知道,.NET 应用程序中要使用多种类型的内存,包括:堆栈、非托管堆和托管堆。这里我们需要简单回顾一下。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。COM 组件、ActiveX 接口和 Win32 API 函数...
2021-09-16 14:29:46
勇哥注:大家都知道在window里,进程之间通讯可以用消息通讯。但是有个较冷门的知识就是RegisterWindowMessage。一般的sendmessage和postmessage是需要在窗体程序间进行通讯,你得知道对方窗口的句柄。这个句柄每次启动程序时是系统分配的,每次不一样。有了这个RegisterWindowMessage,两个进程可以共同持有一个相同的“句柄”,然后两者的顶层窗体间可以...
2021-09-08 08:13:21
经过两个多小时的google和试探,终于搞定了一段代码.通过这个代码可以控制当前线程的CPU使用量.下面是代码:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.InteropS...
2021-09-06 11:16:12
sender as ObservableCollection<string> 为啥为null ? 查看下sender的传入值,确实是有内容的。查看下sender的定义如下,确实是一个ObservableCollection<string>类型。用即时窗口看下:sender is List<string>
false
sender is ObservableC...
2021-09-02 18:48:35
勇哥注:最近开发的软件遇到一些问题,主要是爆cpu时间,这样的后果是软件运行时间一长就会越跑越慢,最终UI失去响应。用vs来排除,目前只知道对可疑代码进行失能,再配合任务管理器观察 :cpu使用率, cpu时间,线程,句柄等参数来判断可疑代码是不是有问题。如果搜索一下网络,貌似这个问题大部分答案只是对线程做sleep,没啥子可用的信息。因此是时候涨点知识了,我把学习方向放在用WinDbg调试用户模...