解决ArcEngine开发程序“假死”现象

简介: 在GIS数据处理中,数据量大是一个非常伤脑筋的问题。最近,在写一个CAD注记转Shapefile文件时,又遇到这个问题。   曾经处理一次数据,达130万个点,即测试区域内的栅格转成点全部处理,程序是写好了,但速度之慢啊,关键问题是处理到一半报奇怪的错误,最后只好将数据分成6份,去实验室开了6台机子来分别处理,最后合成在一起。

  在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,执行结果就好多了,程序界面可以拖动了,数据在后台处理。但由于不懂线程和进程,其安全问题也需要解决,要好好研究一下这个神奇的东西。

 

image

  为了让用户知道程序还在处理,还没有结果,得加一个进度条:当进程开始时,进度条出现,并不断滚动显示;当进程结束时,进度条隐藏。

  但我在进程中访问设置进度条的属性失败了,报错:"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);
            }
        }
    }
}
目录
相关文章
关于 qml程序在目标机上开发时运行出现不断闪屏现象的 解决方法
关于 qml程序在目标机上开发时运行出现不断闪屏现象的 解决方法
关于 qml程序在目标机上开发时运行出现不断闪屏现象的 解决方法
|
3月前
|
移动开发 JavaScript C#
分享53戏源代码总有一个是你想要的(亲测每一个均可用)
分享53戏源代码总有一个是你想要的(亲测每一个均可用)
23 0
【转】解决Pyqt5界面假死现象(以QProgressBar为例)
【转】解决Pyqt5界面假死现象(以QProgressBar为例)
|
Web App开发 小程序 开发者
三分钟创建一个小程序-每天三分钟玩转小程序 1
三分钟创建一个小程序-每天三分钟玩转小程序 1
三分钟创建一个小程序-每天三分钟玩转小程序 1
|
缓存 测试技术 数据库
【测试基础理论】卡死我了!这算bug么?(非功能-效率性)
【测试基础理论】卡死我了!这算bug么?(非功能-效率性)
|
Java
分析一个常见的java多线程通信问题(假死现象)
一件复杂的事,一个人如果不能做,两个人又做的不好,一群人就可能很好的解决了。对于线程来说也是,通过多个线程就能完成一个更复杂的功能,这就需要多个线程协作,协作就需要交流,但是交流总是会出问题的。在这篇文章中我们分析一下java多线程通信过程中出现的一个假死现象。然后给出一个解决办法
494 0
分析一个常见的java多线程通信问题(假死现象)
|
Web App开发 Java
小玩意 - Chrome插件——GreenChrome(GC)失效如何解决?
小玩意 - Chrome插件——GreenChrome(GC)失效如何解决?
298 0
|
存储 SQL Web App开发
你们的系统真的安全吗?你们系统是不是也有这种诡异的情况呢?
这个文章来源灵感是公司的项目在安全检查的时候,发现了很多 SQL 注入的一些问题还有一些 XSS 攻击问题,SQL 注入我们都是比较了解的,那么什么是 XSS 攻击呢?测试反馈给我的时候我是一脸懵逼呀,现在我们就来说一下什么是 XSS 攻击,以及我们怎么防止它的出现。
Qt 3D Studio-08-尝试写一个虚拟仪表(崩溃),一看就会,一做就废
今天终于鼓起勇气来再次更新关于Qt 3D Studio的内容,也真正感受到了什么是“一看就会,一做就废”,我以为我以为的终究还不是我以为的。明明是和Demo一样的资源,一样的参数,最后出来的效果确实一个天上一个地下。
123 0
Qt 3D Studio-08-尝试写一个虚拟仪表(崩溃),一看就会,一做就废
|
IDE 开发工具
Qt Creator总是死机怎么办?越用越卡,越来越慢~囧~
Qt Creator总是死机怎么办?越用越卡,越来越慢~囧~
830 0

相关实验场景

更多