2022-11-10 08:57:39
勇哥注:我们继续上一篇《C# 勇哥关于多线程读写plc内存的研究续,解决UI控件读写的效率问题》此系列贴子已经写了好几篇了:(3)C# 勇哥关于多线程读写plc内存的研究续,解决UI控件读写的效率问题http://www.skcircle.com/?id=1985(2)C# 勇哥关于多线程读写plc内存的研究续,解决lock锁的效率问题http://www.skcircle.com/?id=198...
2022-11-09 15:50:13
由于List之间的相等的话,等于是把List的地址给赋值过去了,赋值后的List变化,会改变原有的List,并没有起到备份原始数据的作用,对于没有嵌套的List,可以采用遍历重新赋值的方法去赋值(传递的是值类型,并非引用类型),若List内的数据是一个类的话,赋值的时候需要重新实例化才行。但如果是嵌套的List列表,遍历这种方法就麻烦了很多。因此,常见的对List进行复制克隆的方法,有以下三种:方...
2022-11-08 21:25:07
今天继续研究“多线程读plc内存“时发现一个问题。我弄了一个定时器,以300ms间隔时间,执行读plc的4个内存地址的工作。然后,拖动窗口时明显感觉很卡。timer中写了4条输出信息到控件上的语句。每条输出控件的语句都使用了BeginInvoke方式的委托。 private void timer1_Tick(object sender, EventArgs e)
{...
2022-11-08 17:33:28
1.建立一个WinForm工程,默认生成了一个WinForm窗体Form1。2.引用—>添加引用—>浏览—>weiFenLuo.winFormsUI.Docking.dll。3.设置Form1窗体属性IsMdiContainer:True。4.工具箱—>右键—>选择项—>.net组件—>浏览—>weiFenLuo.winFormsUI.Docking...
2022-11-08 17:04:01
在使用这个控件的时候,估计大家都会碰到 这样一个问题,就是当窗口是自动隐藏的时候,好像出来的大小一般比实际的大,感觉不太美观,有没有什么方法可以控制它的呢,答案是当然有了,其实实现起来也很简单。 [LocalizedCategory("Category_Docking")]
[LocalizedDescription("DockConte...
2022-11-08 17:01:38
基础布局网上有的是,不再赘述,在此仅描写一些犄角噶蓝儿,不容易查到,但会遇到的问题:1,假设共3个区域,想让布局显示方式为左侧一个区域,右侧呈上下区域。通过dockpanel.show(参数)逐一show出来,结果却发现可能布局与自己想象的不一致。结果布局可能为上一个区域,左右两个区域的这种布局,图:,解决方案:改变代码show的顺序即可。图:2,点击首页按钮,自动在document区域新增首页。...
2022-11-08 16:57:45
停靠窗体有两种状态,一种是固定停靠显示,一种是自动隐藏停靠显示。表现为“自动隐藏”按钮是否处于按下状态。针对这两种状态,可以分别设置两个对应的属性,即可实现指定停靠窗体宽度的目的。约定:mainForm是主窗体,主窗体上放置了一个DockPanel;dockForm是停靠窗体,停靠在主窗体的右部即:dockForm.DockArea = DockAreas.DockRight; 一、固定停靠显示即...
2022-11-08 15:20:01
勇哥注:此为工作中的杂记,也是方便自己查阅。所以不会费心做基础解释,如果各位感觉有用的部分可以留言和勇哥讨论。持续记录中。。。。(四) 为什么这个表格控件已经置为dockstyle.fill了,但是无法填充满容器。红色区域为无法填充满的位置。这个填充不满的区域,在切换窗口时,有可能会出现刷新的问题。这个问题确实古怪,它并不是控件属性Margin的问题。这个datagridview无论放在什么容器内...
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-11-01 15:45:55
勇哥注:
多线程读写非全双工的硬件资源,是个实现比较困难的任务。
有不服气的同学可以尽管一试。我们说一个硬件如果是全双工,则表示它的读写是两个信道,可以同时进行。但是像很多品牌的plc,一般是不能全双工进行通讯的;另外还有串口,我们也不能全双工通讯。如果你的系统只有一个串口,你如何做到能让多线程读写呢?这要求你写的代码能实现: 多线程可同时访问,但是取得结果是分时取得。 读写功能必须互斥。每...
2022-10-31 19:51:31
勇哥注:
一般我们通过使用windows的任务管理器来分析软件的性能问题。
通过cpu占用率、cpu时间、线程数量、句柄数量几个关键参数来分析软件存在的内在泄露、
暴句柄、吃cpu等等问题。
这里我们来研究一下vs自带的性能分析工具,勇哥之前也没有接触过。
因此此篇我与大家共同学习。这一篇讲“内存使用率”工具。先提供一段存在内存泄露的代码。 private void button2_C...
2022-10-28 16:22:32
勇哥注:
一般我们通过使用windows的任务管理器来分析软件的性能问题。
通过cpu占用率、cpu时间、线程数量、句柄数量几个关键参数来分析软件存在的内在泄露、暴句柄、吃cpu等等问题。
这里我们来研究一下vs自带的性能分析工具,勇哥之前也没有接触过。因此此篇我与大家共同学习。(一)先看下怎么启用vs的性能分析工具。首先,调试菜单选择“性能探查器"。点击 之后会出现下面的界面。这...
2022-10-28 15:02:20
今天遇到一个C#的Crash,用windbg打开dump,加载sos之后一看,在4号线程出了一个System.InvalidOperationException,在这个地址上调用!pe。可以看到如下的异常信息:12345Exception object:Exception type: System.InvalidOperationExceptionMessage: The calling thre...
2022-10-28 10:59:34
勇哥注:
一个winform窗口,被Show()后是非模态窗口,被ShowDialog()是模态窗口,这个知识是无人不晓的。
但是,有些时候,会产生弹出窗口卡死、阻塞显示、无法置顶的诸多问题。
这一篇和勇哥一起研究一下这些现象。先来看下现象:下面的form是由Show()方法弹出来的。屏幕产生了阻塞显示的现象。看下任务管理器,提示这个弹出winform是“无响应”的。如果你此时去操作调用者的...
2022-10-28 10:18:48
Win32下的windows API SendMessage,在用户模式下发送是无效的。现象就是你怎么发送,对方的程序就是收不到。窗口句柄什么的、程序都没问题的。这个时候,你得把C#程序系统用户级别提升为windows管理员级别,才可以解决问题。方法是在你的引导工程这边,引入app.mainifest进行windows账号配置这个文件打开后,是下面这样的:我们只需要按提设置下面这句: <r...
2022-10-26 09:12:19
勇哥注:
C#的 DataGridView控件功能强大。许多知识点会常用常忘记,在这里做个记录吧,以方便查询。
阅读此文需要你对此控件有初步的认识。
另外一点,不要以为它只是用于显示数据的表格,要打破这种认知。未完待续。。。。(十) DataGridViewButtonColumn 怎么设置显示内容。2022/11/16 添加:DataGridViewButtonColumn 是按钮项。用下...
2022-10-24 20:44:09
勇哥注:
BackgroundWorker是标准的更新软件界面的一个组件。
它可以用于软件启动界面、刷新IO表、刷新界面硬件实时数据、相机的实时采集模式等等这样的应用中。
这些应用的特点就是后台执行一组耗时操作,而ui又需要实时更新后台操作的进度或者结果信息。
此组件常用常忘,因此留文备查。一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用B...
2022-10-24 16:08:16
此篇是勇哥的随记,很多疑问,和猜测,可能不准确,但是网上也搜不到相应的资料。各位看客如果发现有问题请指正。。。。(图1)今天发现我开发的通用运动软件,在一台比较差的电脑配置上面。cpu占用率为0, cpu时间基本不动。然而在一台i9电脑上面,此电脑比较牛B,是可以用来做深度学习的。同样跑通用运动软件。cpu占用率在2%-4%, cpu时间跟北京时间的秒数差不多快。勇哥一直以为,同样的软件,cpu越...
2022-10-23 11:07:51
C#的 datagridView控件功能强大其中单元格类型可以是按钮、下拉框、选择框、文本框。做为选择框时 即单元格为 DataGridViewComboBoxColumn 类型。这种类初始化时设置内容是容易的,如下: DataGridViewComboBoxColumn MotionMethodList = new DataGridViewComboBoxColumn(...
2022-08-26 08:10:23
正常的添加根结点的效果如下:但是勇哥使用时是这样的其原因是没有指定显示内容的属性。TreeViewAdv控件的显示内容包括: 选择框、文件夹图标、textbox控件你得先指定这些要显示的对象的属性演示代码:using Aga.Controls.Tree;
using System;
using System.Collections.Generic;
using System.Componen...
2022-08-02 22:08:43
引言:
勇哥想研究一下C#内嵌脚本的知识。
主要想把运动控制、视觉的一些功能封装成指令,用脚本语言进行调用。
就像机器人的vb语言,它就是把一些功能封装成指令进行调用。例如lua可以扩展nginx的功能,直接访问MySql数据库,达到1000k的访问量级别。另外,Lua也是可以扩展游戏的功能,即做游戏外挂。一、利用LuaInterface调用lua代码1、下载luainterface,这...
2022-08-02 21:53:52
引言:
勇哥想研究一下C#内嵌脚本的知识。
主要想把运动控制、视觉的一些功能封装成指令,用脚本语言进行调用。
就像机器人的vb语言,它就是把一些功能封装成指令进行调用。CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧。DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了。如果你从来没接触过 CodeDom,你大概可以根据这个名字,推断...
2022-08-02 08:33:54
这个输出路径很多小伙都不知道怎么填写。其实很简单。你记住:先点“浏览” 看下当前的位置然后准备填写自己想要的相对路径串,其中: ..\ 是上一级 .\是下一级然后你判断是上一级还是下一级,然后添入路径串。例如勇哥输入的是 ..\..\dll\ 指的是当前位置的上一级的上一级的dll目录下面。输入完路径,按“浏览”,可以随时看到位置是不是你想要的位置,不是的话就改动路径串,重复这个过程...
2022-07-27 16:52:58
一直以为在路径表示中应该为\
实际上/也是可以的,勇哥还一直以为/的表示是halcon中专用的。
惭愧!!
moduleDir="ModuleObjectConfig\\LinearModule" 其实可以表示为
moduleDir="ModuleObjectConfig/LinearModule"
Directory.Exi...
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...