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

    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);
                }
            }
        }
    }
  • 相关阅读:
    作业3
    学习进度
    作业2
    介绍自己,并介绍github注册过程和初步使用
    mysql显示中文乱码问题解决
    数学能力测试
    C++ Primer总结
    shell脚本
    完全二叉树
    test命令的测试功能
  • 原文地址:https://www.cnblogs.com/liweis/p/4180557.html
Copyright © 2020-2023  润新知