解决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);
            }
        }
    }
}
时间: 2024-10-24 12:30:47

解决ArcEngine开发程序“假死”现象的相关文章

C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法

  这篇文章主要介绍了C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法,本文通过Application.DoEvents()解决这个问题,并讲解了Application.DoEvents()的作用,需要的朋友可以参考下 特别是针对循环或timer处理中需要在窗体控件显示数据时,因后台处理过度繁忙而出现没刷新或者假死现象时,可以使用 代码如下: Application.DoEvents(); Application.DoEvents()的作用 代码如下: private void

xp系统开机出现假死现象怎么解决呢?

  什么是电脑假死现象?当电脑使用时间变长之后,就会卡在一个画面,鼠标也无法移动,这就是电脑假死现象,这和真实的电脑死机不同,电脑假死不需要强制关机重启,完全可以被"救活".是什么原因造成了这样的情况呢?往往是由于电脑中安装的软件太多,超过了电脑的负荷,电脑难以承受,所以会造成卡死的现象.下面小编告诉你们如何避免以及如何解决这种问题. 具体的解决方法如下: 1.我们首先打开电脑的开始菜单选项,然后在栏目中看到有一个运行选项,我们点击打开. 2.在打开的运行对话框中,我们就可以输入字符命

Win7系统程序假死未响应的解决办法

  应用程序出现假死未响应这样的原因可能是因为这个程序在运行时向系统请求资源,但一直处在资源不足的状态下,久而久之就会出现未响应现象.下面小编就为大家介绍一下Win7系统程序假死未响应的常见处理办法. 1.首先,我们可以将鼠标移动的任务栏,右键点击假死程序图标,选择关闭窗口,一般情况下这样就可以解决问题了. 2.如果还不行,我们就打开任务管理器(按下Ctrl+Alt+Delete,Win8以上用户请按下Ctrl+Alt+Esc),选择假死未响应的程序或进程,点击结束任务. 3.再不行,我们就要搬

Windows XP任务栏假死现象解密

使用了一段时间的Windows XP后,相信很多朋友都曾遇到过这样的问题:电脑在用着用着时,突然任务栏不起作用了,点击后没有任何效果,犹如死机一般,但桌面还正常,片刻过后,故障会自行恢复正常.这就是Windows XP任务栏假死现象.微软也推出了专门的补丁程序来解决这个问题,你可以下载Windows XP任务栏假死补丁. 但好像打上补丁后,问题依然没有彻底解决,这其中和Windows XP提供的输入法状态条可以进行位置随意移动有很大关系,我做了一下实验发现,关闭输入法状态条后任务栏出现假死的现象

如何应对Win8资源管理器假死现象

  1.打开"计算机"单击"查看"→"选项"; 2.在"文件夹选项"中单击"查看"; 3.找到"在单独的进程中打开文件夹窗口"并勾选,按"应用"即可解决假死现象; 文件夹假死,运行程序假死,这是使用Windows系统过程中经常遇到的问题,而关于win8系统资源管理器假死现象也是其中的一种,但这问题并不是解不开,我们可以进行适当的设置来避免这些现象的发生.

Windows画图程序假死的原因

尽管当前能后期编辑图片的软件很多,但笔者粘贴屏幕抓图.将BMP文件另存为JPG格式时,还是喜欢 使用Windows自带的画图程序.不过,在使用画图程序却遇到了奇怪的问题:当想保存图片时,只要指定 保存位置和文件名后点击"保存"按钮就会出现画图程序无响应,只能强制结束进程,因此造 成画图程序无法正常工作! 这是怎么回事呢?笔者还真头一次遇到,于是"搜畅刮肚"的来寻找画图程序"假死 "的真正原因-- 尝试一:莫非"画布"太大? 具

Win7系统任务栏假死现象怎么回事?

    Win7系统任务栏假死现象怎么回事? 1.将一些没有必要的启动程序关闭掉,方法是首先打开运行对话框并输入msconfig,回车打开系统配置窗口,切换到"启动"选项卡下,然后将不必要的启动取消勾选点击确定即可. 2.首先鼠标右击任务栏,右键菜单中选择"启动任务管理器"选项,然后在进程中先将explorer.exe结束,然后点击窗口上方的"文件-新建任务",然后再打开的创建新任务界面中输入"explorer.exe",点击

win7在使用过程中老是出现假死现象怎么办

win7系统相信大家都不陌生,但是在使用的过程中很多时候会出现各种各样我们不知道的问题,由于我们刚刚使用win7系统或者第一次遇到这种问题根本就不知道要怎么解决,这时候我们就要问别人了,就像有个朋友问我他win7系统为什么老是假死. 1 win7系统老是假死的问题具体描述: win7在使用的过程中,如开机.使用IE浏览器.聊QQ.玩游戏反正不管你在做什么都有可能导致win7突然进入假死状态,假死状态就是突然不能动了,点击什么也没反应,但是有的时候过的几秒又好了有得时候会比较久.如果是一天一次两次

Win7如何解决Firefox、Flash假死问题

  说到日常主流浏览器,不得不提及Mozilla Firefox浏览器.不知不觉中,这只火狐从最早的Firefox 3.0一直跨入Firefox 30里程碑.由于火狐默认将Flash插件加入自动播放白名单.这也意味着用户访问网页时,火狐将自动加载整个网页中所有Flash元素. 不过火狐的"好意"常常给用户带来不便,例如打开过多Flash网页时,常常遇到Flash假死,更严重的是直接导致火狐停止响应,尤其在机械硬盘上更为严重.这次,IT之家也为忠实的火狐用户整理浏览器技巧,帮助大家彻底解