解决ArcEngine开发程序“假死”现象
在GIS数据处理中,数据量大是一个非常伤脑筋的问题。最近,在写一个CAD注记转Shapefile文件时,又遇到这个问题。
曾经处理一次数据,达130万个点,即测试区域内的栅格转成点全部处理,程序是写好了,但速度之慢啊,关键问题是处理到一半报奇怪的错误,最后只好将数据分成6份,去实验室开了6台机子来分别处理,最后合成在一起。经历过这件事后,我就去请教老师,他们在用程序处理GIS大数据时(特别是当数据带有空间信息),怎么来解决类似的问题?他总结了两方面:一是硬件上,配置要高,对于特别大的数据考虑使用工作站或服务器来处理,GIS处理本来就是容易遇到这种情况;二是代码上,要不断优化,不该new的就不要new,能省则省,写出比较节约内存和空间的代码,需要不断的积累和学习。
对于用户来说,他们绝对不能容忍“假死现象”,一点击“提交”程序界面就卡住了,如果强行进拖动界面容易出现未响应,直到程序关闭。
由于自己非计算机专业出身,对这类问题是束手无策,网上的解决方案是多线程,于是我尝试去这样做:
Thread MyThreadOne = new Thread(new ThreadStart(Main));
MyThreadOne.Name = "CADToShapeThread";
MyThreadOne.IsBackground = true;
MyThreadOne.Start();
将原来直接写的代码放在一个Main函数中,然后新建一个Thread调用Main,执行结果就好多了,程序界面可以拖动了,数据在后台处理。但由于不懂线程和进程,其安全问题也需要解决,要好好研究一下这个神奇的东西。
为了让用户知道程序还在处理,还没有结果,得加一个进度条:当进程开始时,进度条出现,并不断滚动显示;当进程结束时,进度条隐藏。
但我在进程中访问设置进度条的属性失败了,报错:"Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on."百度说,这样是不安全的,要用委托来解决,委托?又搞不懂了,得恶补呀。下面是最终解决方案:
/// <summary>
/// 设置控件参数
/// </summary>
/// <param name="oControl">控件</param>
/// <param name="propName">参数名称</param>
/// <param name="propValue">参数值</param>
delegate void SetControlValueCallback(Control oControl, string propName, object propValue);
private void SetControlPropertyValue(Control oControl, string propName, object propValue)
{
if (oControl.InvokeRequired)
{
SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
oControl.Invoke(d, new object[] { oControl, propName, propValue });
}
else
{
Type t = oControl.GetType();
System.Reflection.PropertyInfo[] props = t.GetProperties();
foreach (System.Reflection.PropertyInfo p in props)
{
if (p.Name.ToUpper() == propName.ToUpper())
{
p.SetValue(oControl, propValue, null);
}
}
}
}
解决ArcEngine开发程序“假死”现象的更多相关文章
- 解决因为终端打印造成的java程序假死
问题状态: java 程序 日志采用 log4j 运行时由另一个管理进程拉起,程序在后台运行. 现象: 程序后台运行时,运行一段时间后假死 分析原因: 尝试打印输出,定位假死的具体位置,发现出现假死的 ...
- tomcat假死现象 - 二
1 编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况.简单描述下该台tomcat当时具体的表现:客户端请求没有响 ...
- tomcat 假死现象(转)
1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台 ...
- tomcat假死现象(转)
1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台 ...
- MySQL如果频繁的修改一个表的数据,那么这么表会被锁死。造成假死现象。
MySQL如果频繁的修改一个表的数据,那么这么表会被锁死.造成假死现象. 比如用Navicat等连接工具操作,Navicat会直接未响应,只能强制关闭软件,但是重启后依然无效. 解决办法: 首先执行: ...
- WPF非UI线程访问网络资源造成页面假死现象
公司内部一个项目是用WPF作为GUI 访问web接口的形式获取数据, 但是由于数据量比较大,也没做分页,于是就需要一个loading的控件,网上查了很多资料但都比较浅.这里完成需求后,总结一下. 首先 ...
- FTPClient下载文件,程序假死问题
[所属类包] org.apache.commons.net.ftp.FTPClient [现象描述] 这两天java项目中用到了FTP下载,像之前的项目写好代码,但是点击下载后,程序调试到下面这一行, ...
- 解决Windows 8系统假死的方法
大部分半卡死的现象是因为Dynamic Tick的一个Bug.Dynamic Tick是NT 6.2内核的一个新功能(其实Linux早就有了),原理的话大概是在空闲的时候把CPU完全暂停,来节省电量. ...
- 实现winfrom进度条及进度信息提示,winfrom程序假死处理
1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口 ...
随机推荐
- [SPOJ-LCS]Longest Common Substring
题目大意: 求两个字符串的LCS. 思路: 对其中一个字符串构建SAM,然后用另一个字符串在里面匹配,按照SAM的边一直往下走,匹配到的连续的字符数就是公共字串的长度. #include<str ...
- Problem H: 深入浅出学算法009-韩信点兵
Description 秦朝末年,楚汉相争.有一次,韩信将1500名将士与楚王大将李锋交战.苦战一场,楚军不敌,败退回营,汉军也死伤四五百人,于是,韩信整顿兵马也返回大本营.当行至一山坡,忽有后军来报 ...
- SMACH专题(三)----几种State类型
状态机提供了若干种状态,包括了Generic State,CBState,SimpleActionState (ROS),ServiceState (ROS),MonitorState (ROS).下 ...
- 记ie8及以下版本ie的flash的addCallback的一坑
近来有一需求,播放声音,我在高端浏览器实现了html5 audio标签.低端浏览器实现了flash兼容.但是在调试ie8以下的浏览器发现js死活调不了flash里的addCallback的方法,总报错 ...
- vultr vs digitalocean vs linode
vultr官方网站:www.vultr.comdigitalocean官方网站:www.digitalocean.comlinode官方网站:www.linode.com 一般来说我们买VPS的时候都 ...
- MAX II Device Compatibility with 5.0-V CMOS Devices
http://www.altera.com/literature/hb/max2/max2_mii51009.pdf The open-drain pin never drives high, onl ...
- LeetCode152:Maximum Product Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- WIN8.1 IE11 F12开发者人员工具,开启什么都不显示
WIN8.1 IE11 F12开发者人员工具,开启什么都不显示,求大神帮忙? IE11也没法重装, 还原IE设置过了. 没有效果. 也试过把IE停掉,重启后再重新打开 也没用 已经解决了 删除 ...
- C#关键字var是什么,在何种情况下使用
从.NET 3.0开始,在方法内部可以使用var关键字声明局部变量.var关键字到底是什么?在何种情况下使用呢? □ var关键字用来隐式地声明一个数据类型,变量类型是在编译期确定的,而不是在运行时确 ...
- C#编程(五)----流程控制
流控制(控制语句) 程序的代码不是按照从上往下执行的,是按照控制语句执行的. 条件语句 C#中有两个控制语句:if语句还有switch语句 1.if语句 C#中继承了C和C++中的if语句,语法直 ...