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

在GIS数据处理中,数据量大是一个非常伤脑筋的问题。最近,在写一个CAD注记转Shapefile文件时,又遇到这个问题。

曾经处理一次数据,达130万个点,即测试区域内的栅格转成点全部处理,程序是写好了,但速度之慢啊,关键问题是处理到一半报奇怪的错误,最后只好将数据分成6份,去实验室开了6台机子来分别处理,最后合成在一起。经历过这件事后,我就去请教老师,他们在用程序处理GIS大数据时(特别是当数据带有空间信息),怎么来解决类似的问题?他总结了两方面:一是硬件上,配置要高,对于特别大的数据考虑使用工作站或服务器来处理,GIS处理本来就是容易遇到这种情况;二是代码上,要不断优化,不该new的就不要new,能省则省,写出比较节约内存和空间的代码,需要不断的积累和学习。

对于用户来说,他们绝对不能容忍“假死现象”,一点击“提交”程序界面就卡住了,如果强行进拖动界面容易出现未响应,直到程序关闭。

由于自己非计算机专业出身,对这类问题是束手无策,网上的解决方案是多线程,于是我尝试去这样做:


1

2

3

4

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."百度说,这样是不安全的,要用委托来解决,委托?又搞不懂了,得恶补呀。下面是最终解决方案:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/// <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-05 23:48:50

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

tomcat 假死现象(转)

1.1 编写目的 为了方便大家以后发现进程假死的时候能够正常的分析并且第一时间保留现场快照. 1.2编写背景 最近服务器发现tomcat的应用会偶尔出现无法访问的情况.经过一段时间的观察最近又发现有台tomcat的应用出现了无法访问情况.简单描述下该台tomcat当时具体的表现:客户端请求没有响应,查看服务器端tomcat的进程是存活的,查看业务日志的时候发现日志停止没有任何最新的访问日志.连tomcat下面的catalina.log也没有任何访问记录,基本断定该台tomcat已不能提供服务.

多线程操作UI控件——DataGridView假死现象

在多线程编程中,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也 给大家带来很多不便. 今天我就遇到了一个类似的问题,对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的ScrollBars设置为了Both,数据量大于DataGridView显示的的范围,而且没有冻结列

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理

china_xuhua 原文地址 1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线 程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息).下面我就简单结合一个我写的例子给大家做一个介绍. 第一步:设计界面,注意需要引用 using System.Threading; 控件名称分别为: progressBar1:label1:textBox1:button1: 第二

实现winfrom进度条及进度信息提示,winfrom程序假死处理

1.方法一:使用线程 功能描述:在用c#做WinFrom开发的过程中.我们经常需要用到进度条(ProgressBar)用于显示进度信息.这时候我们可能就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息).下面我就简单结合一个我写的例子给大家做一个介绍. 第一步:设计界面,注意需要引用 using System.Threading; 控件名称分别为: progressBar1:label1:textBox1:button1: 第二步:定义一个代理,用于更新Progr

Delphi 多线程切换输入法后程序假死了

http://bbs.csdn.net/topics/390472740 Delphi/Pascal code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 function TCFADODBStorage.OpenConnection: Boolean;   //线程里打开ADOConnection,在XP下切换输入法程序

delphi 7中使用idhttp抓取网页 解决假死现象

在delphi 7中使用idhttp抓取网页,造成窗口无反应的假死状态.通过搜索获得两种方法. 1.写在线程中,但是调用比较麻烦 2.使用delphi 提供的idantifreeze(必须安装indy).在indy misc中将idfreeantifreeze放入程序中, 将OnlyWhenIdle状态修改为False即可.方便简单. ===================================== 直接采用Delphi自带Control控件INDY组件为例.新建个工程,放上个TIdH

发现用System.Net.Mail发邮件(代码附后),附件稍微大一点就会造成程序假死. 有没有什么简单的解决办法呢? 多谢!!

附件大,上传,发送一定会慢.程序卡,应该是主线程正在发送,邮件造成的.创建其他线程在后台去发.这样就不影响主线程做其他工作了 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net.Mail;

使用arcengine开发程序右键菜单

ArcGIS Engine是ESRI在ArcGIS9版本才开始推出的新产品,它是一套完备的嵌入式GIS 组件库和工具库,使用ArcGIS Engine开发的GIS应用程序可以脱离ArcGIS Desktop而运行.让我们一起来看,右键菜单的设计与实现. 利用ArcGIS Engine开发自定义GIS应用程序中,一般有两种方式来建立右键菜单. 一是利用开发工具自带的右键菜单控件,如Visual Studio中的ContextMenuStrip控件: 二是利用ArcGIS Engine封装好的ITo

完美解决windows10磁盘占用100%并出现卡顿、假死无反应

完美解决windows10磁盘占用100%并出现卡顿.假死无反应 想必大家也跟我一样,自从用win10系统以后经常会出现这种情况:磁盘突然占用100%然后开始出现假死现象,电脑卡住,点击任何软件没反应,播放的歌曲卡住,主机硬盘灯长亮不闪,过了数秒或者数十秒又恢复正常像是没发生一样…刚开始我也是开使各种求助度娘,然后就有了类似下列的做法:关闭家庭组服务.关闭WindowsDefender.关闭Windows Search.关闭ipv6等等,几乎百度的方法我全试过,结果然并卵好吧,这下百度的方法行不