学习地理信息系统有啥用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习地理信息系统有啥用相关的知识,希望对你有一定的参考价值。
例如就业局势和功能
地理信息系统处理、管理的对象是多种地理空间实体数据及其关系,包括空间定位数据、图形数据、遥感图像数据、属性数据等,用于分析和处理在一定地理区域内分布的各种现象和过程,解决复杂的规划、决策和管理问题。通过上述的分析和定义可提出GIS的如下基本概念:
1、GIS的物理外壳是计算机化的技术系统,它又由若干个相互关联的子系统构成,如数据采集子系统、数据管理子系统、数据处理和分析子系统、图像处理子系统、数据产品输出子系统等,这些子系统的优劣、结构直接影响着GIS的硬件平台、功能、效率、数据处理的方式和产品输出的类型。
2、GIS的操作对象是空间数据,即点、线、面、体这类有三维要素的地理实体。空间数据的最根本特点是每一个数据都按统一的地理坐标进行编码,实现对其定位、定性和定量的描述、这是GIS区别于其它类型信息系统的根本标志,也是其技术难点之所在。
3、GIS的技术优势在于它的数据综合、模拟与分析评价能力,可以得到常规方法或普通信息系统难以得到的重要信息,实现地理空间过程演化的模拟和预测。
4、 GIS与测绘学和地理学有着密切的关系。大地测量、工程测量、矿山测量、地籍测量、航空摄影测量和遥感技术为GIS中的空间实体提供各种不同比例尺和精度的定位数;电子速测仪、GPS全球定位技术、解析或数字摄影测量工作站、遥感图像处理系统等现代测绘技术的使用,可直接、快速和自动地获取空间目标的数字信息产品,为GIS提供丰富和更为实时的信息源,并促使GIS向更高层次发展。地理学是GIS的理论依托。
有的学者断言,“地理信息系统和信息地理学是地理科学第二次革命的主要工具和手段。如果说GIS的兴起和发展是地理科学信息革命的一把钥匙,那么,信息地理学的兴起和发展将是打开地理科学信息革命的一扇大门,必将为地理科学的发展和提高开辟一个崭新的天地”。GIS被誉为地学的第三代语言——用数字形式来描述空间实体。地理信息系统(GIS)的分类 GIS按研究的范围大小可分为全球性的、区域性的和局部性的;按研究内容的不同可分为综合性的与专题性的。同级的各种专业应用系统集中起来,可以构成相应地域同级的区域综合系统。在规划、建立应用系统时应统一规划这两种系统的发展,以减小重复浪费,提高数据共享程度和实用性。延伸:配电地理信息系统 在配电自动化系统中地理信息系统(GIS)是一个重要内容:由于配电网节点多,设备分散,其运行管理工作常于地理位置有关,引入配电地理信息系统,可以更加直观的进行运行管理;其内容主要包括:设备管理(FM),是将变电站、馈线、变压器、开关、电杆等设备的技术数据反映在地理背景图上;用户信息系统(CIS),指借助GIS对大量用户信息,如用户名称、地址、帐号、电话、用电量和负荷、供电优先级、停电记录等进行处理,便于迅速判断故障的影响范围,而用电量和负荷的统计信息还可作为网络分析的依据;停电管理系统(OMS),是指接到停电投诉后,GIS通过调用CIS和SCADA功能,迅速查明故障地点和影响范围,选择合理的操作顺序和路径,显示处理过程中的进展,并自动将有关信息转给用户投诉电话应答系统;另外GIS还可具有辅助配电网发展规划设计功能等。我国地理信息系统的发展情况 我国地理信息系统的起步稍晚,但发展势头相当迅猛,大致可分为以下三个阶段。
第一是起步阶段。20世纪70年代初期,我国开始推广电子计算机在测量、制图和遥感领域中的应用。随着国际遥感技术的发展,我国在1974年开始引进美国地球资源卫星图像,开展了遥感图像处理和解译工作。1976年召开了第一次遥感技术规划会议,形成了遥感技术试验和应用蓬勃发展的新局面,先后开展了京津唐地区红外遥感试验。新疆哈密地区航空遥感试验、天津渤海湾地区的环境遥感研究、天津地区的农业土地资源遥感清查工作。长期以来,国家测绘局系统开展了一系列航空摄影测量和地形测图,为建立地理信息系统数据库打下了坚实的基础。解析和数字测图、机助制图、数字高程模型的研究和使用也同步进行。1977年诞生了第一张由计算机输出的全要素地图。1978年,国家计委在黄山召开了全国第一届数据库学术讨论会。所有这些为GIS的研制和应用作了技术上的准备。
第二是试验阶段。进入80年代之后,我国执行“六五”、“七五”计划,国民经济全面发展,很快对“信息革命”作出热烈响应。在大力开展遥感应用的同时,GIS也全面进入试验阶段。在典型试验中主要研究数据规范和标准、空间数据库建设、数据处理和分析算法及应用软件的开发等。以农业为对象,研究有关质量评价和动态分析预报的模式与软件,并用于水库淹没损失、水资源估算、土地资源清查、环境质量评价与人口趋势分析等多项专题的试验研究。在专题试验和应用方面,在全国大地测量和数字地面模型建立的基础上,建成了全国1:100万地留数据库系统和全国土地信息系统、1:4见万全国资源和环境信息系统及1:250万水土保持信息系统,并开展了黄土高原信息系统以及洪水灾情预报与分析系统等专题研究试验。用于辅助城市规划的各种小型信息系统在城市建设和规划部门也获得了认可。
在学术交流和人才培养方面得到很大发展。在国内召开了多次关于GIS的国际学术讨论会。1985年,中国科学院建立了“资源与环境信息系统国家级重点开放实验室”,1988年和1990年武汉测绘科技大学先后建立了“信息工程专业”和“测绘遥感信息工程国家级重点开放实验室”。我国许多大学中开设了rs方面的课程和不同层次的讲习班,已培养出了一大批从事GIS研究与应用的博士和硕土。
第三是GIS全面发展阶段。80年代末到90年代以来,我国的GIS随着社会主义市场经济的发展走上了全面发展阶段。国家测绘局正在全国范围内建立数字化测绘信息产业。1:100万地图数据库已公开发售,卫:25万地图数据库也已完成建库,并开始了全国1:10万地图数据库生产与建库工作,各省测绘局正在抓紧建立省级1:1万基础地理信息系统。数字摄影测量和遥感应用从典型试验逐步走向运行系统,这样就可保证向GIS源源不断地提供地形和专题信息。进入90年代以来,沿海、沿江经济开发区的发展,土地的有偿使用和外资的引进,急需GIS为之服务,有力地促进了城市地理信息系统的发展。用于城市规划、土地管理、交通、电力及各种基础设施管理的城市信息系统在我国许多城市相继建立。
在基础研究和软件开发方面,科技部在“九五”科技攻关计划中,将“遥感、地理信息系统和全球定位系统的综合应用”列入国家“九五”重中之重科技攻关项目,在该项目中投入相当大的研究经费支持武汉测绘科技大学、北京大学、中国地质大学、中国林业科学研究院和中国科学院地理研究所等单位开发我国自主版权的地理信息系统基础软件。经过几年的努力,中国GIS基础软件与国外的差距迅速缩小,涌现出若干能参与市场竞争的地理信息系统软件,如GeoStar, MapGIS, OityStar, ViewGIS等。在遥感方面,在该项目的支持下,已建立全国基于IK4遥感影像土地分类结果的土地动态监测信息系统。国家这一重大项目的实施,有力地促进了中国遥感和地理信息系统的发展.国内外专家对地理信息系统的不同定义 (国外一些地理信息系统的定义摘自David J.Maguire,1991)。
1、DoE(1987:132)
a system for capturing storing checking, manipulating analysing and displaying data which are spatially referenced the Earth.
2、Aronoff(1989:39)
any manual or computer based set of procedures used to store and manipulate geographically referenced data.
3、Carter(1989:3)
an institutional entiry, reflecting an organizational structure that integrates technology with a database, expertise and continuing, financial support over time.
4、Parker(1988:1547)
an information technology which stores, analyses, and displays both spatioal and non-spatial data.
5、Dueker(1979:106)
a special case of information systems where the database consists of observations on spatioally distributed features, activities, or events, which are definable in space as points, lines, or areas. A GIS manipulates data about these points, lines, and areas to retrieve data for ad hoc queries and analysis.
6、Smith et al.(1987:13)
a database system in which most of the data are spatially indexed, and upon which a set of procedures operated in order to answer queries about spatiol entities in the database.
7、Ozemoy, Smith and Sicherman(1981:92)
an automated set of functions that provides professionals with advanced capabilities for the storge, retrieval, manipulation, and display of geographically located data.
8、Burrough(1986:6)
a powerful set of tools for collecting, storing, retrieving at will, transforming and displaying spatial data from the real world.
9、Cowen(1988:1544)
a decision support system involving the integration of spatially referenced datain a problem-soling environment.
10、Koshkariov, Tikunov and Trofimov(1989:256)
a system with advanced geo-modelling capabilites.
11、Devine and Field(1986:18)
a form of MIS[Management Informaion System]that allows map display of the general information.
12、陈述彭等(1999,《地理信息系统导论》):
由计算机系统、地理数据和用户组成的,通过对地理数据的集成、存储、检索、操作和分析,生成并输出各种地理信息,从而为土地利用、资源管理、环境监测、交通运输、经济建设、城市规划以及政府部门行政管理提供新的知识,为工程设计和规划、管理决策服务高考报名GIS专业的一点注意事项 目前开设地理信息系统专业的院校很多,但是高考报名时注意,分为理科的地图学与地理信息系统,属于地理学,侧重于地理学应用理论研究;工科为地图制图学与地理信息工程,属于测绘学,侧重于测量。两者并无本质区别,报考的时根据自身喜好,工科一般开设于理工科院校,理科则一般为综合性大学或师范大学内。理科的话武汉大学资源与环境科学学院的地理信息系统比较厉害,特别是制图方向。GIS的发展背景 35,000年前,在Lascaux附近的洞穴墙壁上,法国的Cro Magnon猎人画下了他们所捕猎动物的图案。与这些动物图画相关的是一些描述迁移路线和轨迹线条和符木。这些早期记录符合了现代地理信息系统的二元素结构:一个图形文件对应一个属性数据库。 18世纪地形图绘制的现代勘测技术得以实现, 同时还出现了专题绘图的早期版本, 例如:科学方面或户口普查资料。 20世纪初期世纪将图片分成层的“照片石印术”得以发展。直至60年代早期,在核武器研究的推动下,计算机硬件的发展导致通用计算机“绘图”的应用。
1967年世界第一个投入实际操作的GIS系统由联邦能量、矿产和资源部门在安大略省的渥太华开发出来。 这个系统是由Roger Tomlinson开发的,被称为“Canadian GIS”(CGIS)。它被用来存储,分析以及处理所收集来的有关加拿大土地存货清单(CLI)数据。CLI通过在1:250,000的比例尺下绘制关于土壤, 农业, 休闲、野生生物、水鸟、林业, 和土地利用等各种信息为加拿大农村测定土地能力,并增设了了等级分类因素来进行分析。
CGIS是世界的第一个“系统”, 并且在“绘图”应用上进行了改进,它具有覆盖,测量,资料数字化/扫描的功能,支持一个跨越大陆的国家坐标系统,将线编码为具有真实的嵌入拓扑结构的“弧”,并且将属性和位置的信息分别存储在单独的文件中。它的开发者,地理学家Roger Tomlinson,被称为“GIS之父”。
CGIS一直持续到20世纪70年代才完成,但这花费了太长的一段时间,因此在它最初发展期,不能与如Intergraph这样的销售各种商业地图应用软件的供应商竞争。微型计算机硬件的发展使得象ESRI和CARIS那样的供应商成功地兼并了大多数的CGIS特征,并结合了对空间和属性信息的分离的第1 种世代方法与对组织的属性数据的第2种世代方法入数据库结构。20世纪80年代和90年代产业成长刺激了应用了GIS的UNIX工作站和个人计算机飞速增长。至20世纪末,在各种系统中迅速增长使得其在在相关的少量平台已经得到了巩固和规范。并且用户开始提出了在互联网上查看GIS数据的概念,这要求数据的格式和传输标准化。GIS中使用的技术 从不同来源得到相关信息
如果能将你所在州的降雨和你所在县上空的照片联系起来,可以判断出哪块湿地在一年的某些时候会干涸。一个GIS系统就能够进行这样的分析,它能够将不同来源的信息以不同的形式应用。对于源数据的基本要求是确定变量的位置。位置可能由经度,纬度和海拔的 x,y,z坐标来标注,或是由其他地理编码系统比如ZIP码,又或是高速公路英里标志来表示。任何可以定位存放的变量都能被反馈到GIS。一些政府机构和非政府组织生产正在制作能够直接访问GIS的计算机数据库。可以将地图中不同类型的数据格式输入GIS。GIS 系统同时能将不是地图形式的数字信息转换可识别利用的形式。 例如,通过分析由遥感生成的数字卫星图像,可以生成一个与地图类似的有关植被覆盖的数字信息层。 同样, 人口调查或水文表格数据也可在GIS系统中被转换成作为主题信息层的地图形式。
资料展现
GIS 数据以数字数据的形式表现了现实世界客观对象(公路, 土地利用, 海拔)。 现实世界客观对象可被划分为二个抽象概念: 离散对象(如房屋) 和连续的对象领域(如降雨量或海拔) 。这二种抽象体在GIS系统中存储数据主要的二种方法为: 栅格(网格)和矢量。 栅格(网格)数据由存放唯一值存储单元的行和列组成。它与栅格(网格)图像是类似的,除了使用合适的颜色之外,各个单元记录的数值也可能是一个分类组,例如土地使用状况,一个连续的值,或是降雨量,或是当数据不是可用时记录的一个空值。栅格数据集的分辨率取决于地面单位的网格宽度。通常存储单元代表地面的方形区域, 但也可以用来代表其它形状。栅格数据既可以用来代表一块区域,也可以用来表示一个实物,实物被存储为... 矢量数据利用了几何图形例如点,线(一系列点坐标),或是面(形状决定于线)来表现客观对象。例如,在住房细分中以多边形来代表物产边界,以点来精确表示位置。矢量同样可以用来表示具有连续变化性的领域。利用等高线和不规则三角网(TIN)来表示海拔或其他连续变化的值。TIN的记录对于这些连接成一个由三角形构成的不规则网格的点进行评估。三角形所在的面代表地形表面。 利用栅格或矢量数据模型来表达现实既有优点也有缺点。栅格数据设置在面内所有的点上都记录同一个值,而矢量格式只在需要的地方存储数据,这就使得前者所需的存储的空间大于后者。对于栅格数据可以很轻易地实现覆盖的操作,而对于矢量数据来说要困难得多。矢量数据可以象在传统地图上的矢量图形一样被显示出来,而栅格数据在以图象显示时显示对象的边界将呈现模糊状。 除了以几何向量坐标或是栅格单元位置来表达的空间数据外,另外的非空间数据也可以被存储。在矢量数据中,这些附加数据为客观对象的属性。例如,一个森林资源的多边形可能包含一个标识符值及有关树木种类的信息。在栅格数据中单元值可存储属性信息,但同样可以作为与其他表格中记录相关的标识符。
资料撷取
数据撷取——向系统内输入数据——它占据了GIS从业者的大部分时间。有多种方法向GIS中输入数据,在其中它以数字格式存储。 印在纸或聚酯薄膜地图上的现有数据可以被数字化或扫描来产生数字数据。数字化仪从地图中产生向量数据作为操作符轨迹点、线和多边形的边界。扫描地图可以产生能被进一步处理生成向量数据的光栅数据。 测量数据可以从测量器械上的数字数据收集系统中被直接输入到GIS中。从全球定位系统(GPS)——另一种测量工具中得到的位置,也可以被直接输入到GIS中。 遥感数据同样在数据收集中发挥着重要作用,并由附在平台上的多个传感器组成。传感器包括摄像机、数字扫描仪和激光雷达,而平台则通常由航空器和卫星构成。 现在大部分数字数据来源于图片判读和航空照片。软拷贝工作站用来数字化直接从数字图像的立体象对中得到的特征。这些系统允许数据以二维或三维捕捉,它们的海拔直接从用照相测量法原理的立体象对中测量得到。现今,模拟航空照片先被扫描然后再输入到软拷贝系统,但随着高质量的数字摄像机越来越便宜,这一步也就可被省略了。 卫星遥感提供了空间数据的另一个重要来源。这里卫星使用不同的传感器包来被动地测量从主动传感器如雷达发射出去的电磁波频谱或无线电波的部分的反射系数。遥感收集可以进一步处理来标识感兴趣的对象和类例如土地覆盖的光栅数据。 除了收集和输入空间数据之外,属性数据也要输入到GIS中。对于向量数据,这包括关于表现在系统中的对象的附加信息。 输入数据到GIS中后,通常还要编辑,来消除错误,或进一步处理。对于向量数据必须要“拓扑正确”才能进行一些高级分析。比如说,在公路网中,线必须与交叉点处的结点相连。像反冲或过冲的错误也必须消除。对于扫描的地图,源地图上的污点可能需要从生成的光栅中消除。例如,污物的斑点可能会把两条本不该相连的线连在一起。
资料操作
GIS可以执行数据重构来把数据转换成不同的格式。例如,GIS可以通过在具有相同分类的所有单元周围生成线,同时决定单元的空间关系,如邻接和包含,来将卫星图像转换成向量结构。
由于数字数据以不同的方法收集和存储,两种数据源可能会不完全兼容。因此GIS必须能够将地理数据从一种结构转换到另一种结构。
投影系统,坐标系统与转换
财产所有权地图与土壤分布图可能以不同的比例尺显示数据。GIS中的地图数据必须能被操作以使其与从其它地图获得的数据对齐或相配合。在数字数据被分析前,它们可能得经过其它一些将它们整合进GIS的处理,比如,投影与坐标变换。 地球可以用多种模型来表示,对于地球表面上的任一给定点,各个模型都可能给出一套不同的坐标(如纬度,经度,海拔)。最简单的模型是假定地球是一个理想的球体。随着地球的更多测量逐渐累积,地球的模型也变得越来越复杂,越来越精确。事实上,有些模型应用于地球的不同区域以提供更高的精确度(如北美坐标系统,1983-NAD83-只适合在美国使用,而在欧洲却不适用)。
投影是制作地图的基础部分,它是从地球的一种模型中转换信息的数学方法,它将三维的弯曲表面转换成二维的媒介(比如纸或电脑屏幕)。不同类型的地图要采用不同的投影投影系统,因为每种投影系统有其自身的合适的用途。比如一种可以精确反映大陆形状的投影会歪曲大陆的相对尺寸(翻译的是英文的维基百科)
GIS空间分析
空间分析能力是GIS的主要功能,也是GIS与计算机制图软件相区别的主要特征。空间分析是从空间物体的空间位置、联系等方面去研究空间事物,以及对空间事物做出定量的描述。一般地讲,它只回答What(是什么?)、Where(在哪里?)、How(怎么样?)等问题,但并不(能)回答Why(为什么?)。空间分析需要复杂的数学工具,其中最主要的是空间统计学、图论、拓扑学、计算几何等[1],其主要任务是对空间构成进行描述和分析,以达到获取、描述和认知空间数据;理解和解释地理图案的背景过程;空间过程的模拟和预测;调控地理空间上发生的事件等目的[2]。
空间分析技术与许多学科有联系,地理学、经济学、区域科学、大气、 地球物理、水文等专门学科为其提供知识和机理。
除了GIS软件捆绑空间分析模块外,目前也有一些专用的空间分析软件,如GISLIB、SIM、PPA、Fragstats等。
数据建模
将湿地地图与在机场、电视台和学校等不同地方记录的降雨量关联起来是很困难的。然而,GIS能够描述 地表、地下和大气的二维三维特征。
例如,GIS能够将反应降雨量的雨量线迅速制图。
这样的图称为雨量线图。通过有限数量的点的量测可以估计出整个地表的特征,这样的方法已经很成熟。 一张二维雨量线图可以和GIS中相同区域的其它图层进行叠加分析。
拓扑建模
在过去的35年,在湿地边上有没有任何加油站或工厂经营过?有没有任何满足在2英里内且高出湿地的条件的这类设施?GIS可以识别并分析这种在数字化空间数据中的这种空间关系。这些拓扑关系允许进行复杂的空间建模和分析。地理实体音的拓扑关系包括连接(什么和什么相连)、包含(什么在什么之中)、还有邻近(两者之间的远近)。
网络建模
如果所有在湿地附近的工厂同时向河中排放化学物质,那么排入湿地的污染物的数量要多久就能达到破坏环境的数量?GIS能模拟出污染物沿线性网络(河流)的扩散的路径。诸如坡度、速度限值、管道直径之类的数值可以纳入这个模型使得模拟得更精确。网络建模通常用于交通规划、水文建模和地下管网建模。 参考技术A 这个 就最要了 出身社会 你就明白了 参考技术B 通知全局
Delphi 系统单元中的 TMonitor 有啥用?
【中文标题】Delphi 系统单元中的 TMonitor 有啥用?【英文标题】:What is TMonitor in Delphi System unit good for?Delphi 系统单元中的 TMonitor 有什么用? 【发布时间】:2011-03-23 14:21:01 【问题描述】:读完“The Oracle at Delphi”(Allen Bauer)的文章"Simmering Unicode, bring DPL to a boil" 和"Simmering Unicode, bring DPL to a boil (Part 2)" 后,我只了解Oracle :)
文章提到了Delphi并行库(DPL),无锁数据结构,mutual exclusion locks和condition variables(这篇***文章转发到'Monitor (synchronization)',然后介绍了用于线程同步的新TMonitor record type并描述了它的一些方法。
是否有介绍文章以及说明何时以及如何使用这种 Delphi 记录类型的示例?网上有一些documentation。
TCriticalSection 和 TMonitor 的主要区别是什么?
我可以用Pulse
和PulseAll
方法做什么?
它有对应的 C# 或 Java 语言吗?
RTL 或 VCL 中是否有任何代码使用这种类型(因此可以作为示例)?
更新:Why Has the Size of TObject Doubled In Delphi 2009? 文章解释说,现在可以使用 TMonitor 记录锁定 Delphi 中的每个对象,代价是每个实例增加四个字节。
看起来TMonitor的实现类似于Intrinsic Locks in the Java language:
每个对象都有一个内在锁 与之相关联。按照惯例,一个 需要独占的线程和 对对象的一致访问 字段必须获取对象的 访问它们之前的内在锁, 然后释放内在锁 完成后。
Wait、Pulse 和 PulseAll 在 Delphi 中似乎与 Java 编程语言中的 wait()、notify() 和 notifyAll() 对应。如果我错了,请纠正我:)
更新 2:生产者/消费者应用程序示例代码,使用 TMonitor.Wait
和 TMonitor.PulseAll
,基于 Java(tm) tutorials 中有关受保护方法的文章(欢迎 cmets):
这种应用程序共享数据 在两个线程之间:生产者, 创建数据,以及 消费者,这对它有作用。 两个线程使用 共享对象。协调是 必要的:消费者线程必须 不尝试检索数据 在生产者线程之前 交付它,生产者线程 不得尝试提供新数据 如果消费者没有取回 旧数据。
在本例中,数据是一系列文本消息,通过 Drop 类型的对象共享:
program TMonitorTest;
// based on example code at http://download.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html
$APPTYPE CONSOLE
uses
SysUtils, Classes;
type
Drop = class(TObject)
private
// Message sent from producer to consumer.
Msg: string;
// True if consumer should wait for producer to send message, false
// if producer should wait for consumer to retrieve message.
Empty: Boolean;
public
constructor Create;
function Take: string;
procedure Put(AMessage: string);
end;
Producer = class(TThread)
private
FDrop: Drop;
public
constructor Create(ADrop: Drop);
procedure Execute; override;
end;
Consumer = class(TThread)
private
FDrop: Drop;
public
constructor Create(ADrop: Drop);
procedure Execute; override;
end;
Drop
constructor Drop.Create;
begin
Empty := True;
end;
function Drop.Take: string;
begin
TMonitor.Enter(Self);
try
// Wait until message is available.
while Empty do
begin
TMonitor.Wait(Self, INFINITE);
end;
// Toggle status.
Empty := True;
// Notify producer that status has changed.
TMonitor.PulseAll(Self);
Result := Msg;
finally
TMonitor.Exit(Self);
end;
end;
procedure Drop.Put(AMessage: string);
begin
TMonitor.Enter(Self);
try
// Wait until message has been retrieved.
while not Empty do
begin
TMonitor.Wait(Self, INFINITE);
end;
// Toggle status.
Empty := False;
// Store message.
Msg := AMessage;
// Notify consumer that status has changed.
TMonitor.PulseAll(Self);
finally
TMonitor.Exit(Self);
end;
end;
Producer
constructor Producer.Create(ADrop: Drop);
begin
FDrop := ADrop;
inherited Create(False);
end;
procedure Producer.Execute;
var
Msgs: array of string;
I: Integer;
begin
SetLength(Msgs, 4);
Msgs[0] := 'Mares eat oats';
Msgs[1] := 'Does eat oats';
Msgs[2] := 'Little lambs eat ivy';
Msgs[3] := 'A kid will eat ivy too';
for I := 0 to Length(Msgs) - 1 do
begin
FDrop.Put(Msgs[I]);
Sleep(Random(5000));
end;
FDrop.Put('DONE');
end;
Consumer
constructor Consumer.Create(ADrop: Drop);
begin
FDrop := ADrop;
inherited Create(False);
end;
procedure Consumer.Execute;
var
Msg: string;
begin
repeat
Msg := FDrop.Take;
WriteLn('Received: ' + Msg);
Sleep(Random(5000));
until Msg = 'DONE';
end;
var
ADrop: Drop;
begin
Randomize;
ADrop := Drop.Create;
Producer.Create(ADrop);
Consumer.Create(ADrop);
ReadLn;
end.
现在这按预期工作了,但是有一个细节我可以改进:我可以选择一个细粒度的锁定方法,而不是使用TMonitor.Enter(Self);
锁定整个 Drop 实例,使用(私有)“FLock”字段,仅在 TMonitor.Enter(FLock);
的 Put 和 Take 方法中使用它。
如果我将代码与Java版本进行比较,我还注意到Delphi中没有InterruptedException
可以用来取消对Sleep
的调用。
更新 3:2011 年 5 月,关于 OmniThreadLibrary 的blog entry 提出了 TMonitor 实现中可能存在的错误。它似乎与Quality Central 中的条目有关。 cmets 提到了 Delphi 用户提供了一个补丁,但它是不可见的。
更新 4:2013 年的blog post 表明,虽然 TMonitor 是“公平的”,但其性能比临界区差。
【问题讨论】:
TMonitor
有严重的错误,最终在 XE2 upd 4 中得到纠正。错误可以通过在TThreadedQueue
中使用 TMonitor 来体现。请参阅TThreadedQueue not capable of multiple consumers?
了解更多信息。
【参考方案1】:
TMonitor 将临界区(或简单互斥体)的概念与条件变量结合在一起。您可以在此处了解什么是“监视器”:http://en.wikipedia.org/wiki/Monitor_%28synchronization%29。
任何你会使用临界区的地方,你都可以使用监视器。您可以简单地创建一个 TObject 实例然后使用它,而不是声明一个 TCriticalSection。
TMonitor.Enter(FLock);
try
// protected code
finally
TMonitor.Exit(FLock);
end;
其中 FLock 是任何对象实例。通常,我只是创建一个 TObject:
FLock := TObject.Create;
【讨论】:
FLock 是任何对象实例。它可以只是一个简单的 TObject 实例。 FLock := TObject.Create; 还是不够。您已经展示了如何使用 TMonitor 模拟关键部分,但确定这不是 TMonitor 设计的真正问题。能举个更有趣的代码例子吗? 您可能还想添加一些信息,为什么您选择向 VCL 添加通常被谴责的锁定任何对象的能力。参见例如***.com/questions/251391/why-is-lockthis-bad。 Mjustin,我不会说FLock
是这个例子中的监视器。它有一个监视器,我们用它来保护一些代码。如果我们已经有其他一些 TObject,我们可能会使用它的监视器而不是为此唯一目的创建一个新对象。它不一定是被多个线程使用的对象——这是在try-finally部分中使用的任何东西——但要获得任何好处,其他线程需要知道FLock
这样他们就可以等待同一个对象。 (就像临界区一样,如果只有一个线程使用它是没有用的。)
@Rob:***将 Monitor 定义为“一个旨在被多个线程安全使用的对象”——在示例中,一个锁定对象 (FLock) 用于保护不同对象中的代码。文章 mghie 链接说在对象上创建全局锁是个坏主意(“为什么 lock(this) ... 不好?”)。其他线程不需要“知道”(有权访问)FLock,FLock 可以是私有实例变量,只在一个同步方法中使用。以上是关于学习地理信息系统有啥用的主要内容,如果未能解决你的问题,请参考以下文章
想裁剪CentOS系统,但系统盘下有许多RPM包,如何知道有啥用啊