解决方案 »
- PropertyChangedEventHandler
- 如何讓datagrid 的rowheader顯示行號
- 小妹想知道怎样可以在拖动的时候,把鼠标箭头变为 手抓(只有手指的)样式的.并且拖动到另外一个控件上的时候 触发另一个时间.
- 用A表的某一列的数据做B表某一列的列头,如何用sql语句实现?
- 如何在SQL查询结果中动态加入自动编号
- 请教
- 一个关于多线程和for循环的问题
- winform中 次线程 不能访问 主线程 的控件问题
- 庞果网上编码报错,我在自己本地已经编译通过了。求指点
- 请问怎样用MessageBox.Show看 byte[]的内容?
- 求代码 C# Winform 更改标题头的背景色
- C#程序打包问题
您这个处理完的依据是什么呢?50ms收一次数据全部都放在list?能给个事例说明么?
不太明白您的意思
但是雷达是持续扫描的,数据是实时刷新的。显示在datagridview上,数据会不停的变化着。这样线程就卡死了。不知道我这种情况代码该如何处理
不谈窗体假死时数据断不断的问题
你跑24小时再看,保证卡死了
不管你是前台控件还是后台List
你就不怕某一天内存爆掉了吗
应该后台线程保持不断读数据,读到就放到List里
然后另一个线程对List长度做判断,超过一定长度,入库或存文件,然后remove掉多余的数据
前台控件定时(可以是1秒更新一次,不要太快)从List里把数据拿出来显示在控件上
这个需求,在实现时需要注意两个点:一是程序的运行时间可能比较久,那就不要把数据都放到内存里。二是界面的刷新没必要和和数据的刷新同步,50ms一次更新,界面本来也反应不过来。你需要一个中间介质保存数据,我建议最好是一个数据库,如果是没有服务器的,可以使用像SQLite或者SQL Server Compact这样的嵌入式数据库。比起自己写文件来,一个好处是帮你实现了线程安全的读写,另一个是方便查询。然后需要两个缓冲区(可以就是list,最好创建时就固定好大小),开一个线程不断从设备读取数据到缓冲区,在数据到达一定量(这个可以根据系统性能调整)时,切换到另一个缓冲区,同时使用异步方法或另一个线程将之前填满的缓冲区一次性写入数据库。(其实SQLite每秒写20条数据很轻松,可能都不需要缓冲区)界面上用一个定时器比如1s从缓冲区或者数据库取数据显示到界面,不要一次加载所有数据,可以按需加载,比如默认加载最新的1000条。需要看之前的数据时再加载之前的。
需求跟技术上实现基本都是我要考虑的 因为现在有一款老外写的软件,我看他的数据是实时刷新 也没有安装什么数据库之类的
这就是在一个线程模拟每50ms生成一条数据,然后UI上每200ms更新grid的代码。这个没考虑更多,只是看看和想要的"实时刷新"有什么距离。
_timer = new System.Windows.Forms.Timer(components) { Interval = 200 };
谢谢你的回答,这个地方的components参数报错了 你测试过代码了么?
_timer = new System.Windows.Forms.Timer(components) { Interval = 200 };
谢谢你的回答,这个地方的components参数报错了 你测试过代码了么?我当然测试过,WinForm的designer有时不生成这个components,去掉就是。
_timer = new System.Windows.Forms.Timer(components) { Interval = 200 };
谢谢你的回答,这个地方的components参数报错了 你测试过代码了么?我当然测试过,WinForm的designer有时不生成这个components,去掉就是。明白了 感谢 ,还有最后一个问题,就是我现在的雷达最大的目标扫描数量是9个.
也就是说,ID只能是0-9.然后每一个ID的后面的字段是实时变化的,比如开始1,然后按照你的程序200MS这个值可以直观的看到改变了。9个目标都是这样 ID不变。
能麻烦你改造一下你得例子么。9个ID不变 其余的字段数据200MS改变刷新一次。我还在消化你的代码