日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ArcGIS Engine 中的多线程使用

發(fā)布時間:2025/5/22 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ArcGIS Engine 中的多线程使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自原文ArcGIS Engine 中的多線程使用

一直都想寫寫AE中多線程的使用,但一直苦于沒有時間,終于在中秋假期閑了下來。呵呵,閑話不說了,進入正題!

??????? 大家都了解到ArcGIS中處理大數(shù)據(jù)量時速度是相當?shù)穆?#xff0c;這時如果你的程序是單線程的,那可就讓人著急壞了,不知道處理到什么地步,不能操作其他的功能,無奈~~如果在這時你能夠想到用多線程技術(shù),那就來試試該如何完成吧。

?????? 首先,你得有點VS的多線程經(jīng)驗或?qū)W習經(jīng)驗,得知道什么多線程,代理(Delegate)是什么,同步與異步又是什么,等等。這些在VS的幫助文檔中都有詳細解釋,在這里我就不越俎代庖了。我們其中精神去理解ArcGIS中多線程吧。

?????? 在ArcgIS中,我們分幾個部分闡述多線程。

?????? 1、何時使用多線程

在創(chuàng)建多線程應(yīng)用程序是應(yīng)注意兩點:線程的安全性和線程的伸縮性。線程安全對于所有的對象都是非常重要的,但是僅僅只有線程安全的對象并不意味著成功創(chuàng)建多線程應(yīng)用程序,或者說線程安全能夠提高應(yīng)用程序的性能。

.NET框架允許你在應(yīng)用程序中能夠迅速的創(chuàng)建線程,但是,在編寫ArcObjects代碼的多線程必須要小心。ArcObjects最根本的結(jié)構(gòu)是組件對象模型(COM)。從這一點來說,編寫ArcObjects的多線程的代碼需要既了解.NET多線程,又要了解COM多線程模型。

多線程并不總是使你的程序跑的很快,在許多情況下,它還會增加開支和復雜性,這些最終會減慢程序的執(zhí)行速度。當增加的復雜性是值得的,那么多線程才能使用。一個基本的原則是,如果一個任務(wù)可以分解為不同的獨立任務(wù)時,那這個任務(wù)是適合多線程的。

2、ArcObjects線程模型

所有的ArcObjects組件都被標記為單線程單元(STA參考VS幫助文檔)。每個STA都限制在一個線程中,但是COM并不限制每個進程中STA的數(shù)目。當一個方法調(diào)用進入一個STA,它被轉(zhuǎn)移到STA的唯一線程。因此,在STA中的一個對象將一次只接收和處理一個方法調(diào)用,它接收的每個方法調(diào)用會到達同一線程。

ArcObjects組件是線程安全的,開發(fā)者可把他們在多線程環(huán)境下使用。對于AO應(yīng)用程序在多線程環(huán)境下有效運行,由AO所使用的線程單元模型,即獨立線程,必須加以考慮。該模型的工作原理是消除跨線程通信。一個線程內(nèi)所有ArcObjects對象的引用應(yīng)當只與在同一個線程的對象進行通信。

對于此模型的運行,在ArcGIS 9.X中單個對象都被設(shè)計為線程唯一,而非進程唯一。在進程中管理多個對象的資源消耗超過由制止跨線程通信所獲得的性能提升幅度。

對于擴展ArcGIS系統(tǒng)的開發(fā)者,所有對象甚至包括你創(chuàng)造的對象都必須遵循這一規(guī)則,孤立線程工作。如果你創(chuàng)建的對象做為開發(fā)的一部分,你必須確保它們是線程唯一,而不是進程唯一。線程唯一就是防止跨線程通信,這里ArcGIS Engine中多線程的首要規(guī)則。

3、多線程方案

盡管有很多實現(xiàn)多線程應(yīng)用程序的方式,但以下幾種方案是開發(fā)者經(jīng)常使用的方式。

3.1、后臺線程執(zhí)行長事務(wù)

當要求需要長事務(wù)進行工作時,在后臺執(zhí)行長事務(wù)是可取的,并且同時讓應(yīng)用程序靈活的操作其他任務(wù),并讓界面處于響應(yīng)狀態(tài)。這一操作的例子很多,如:使用FeatureCursor來重復向DataTable裝載數(shù)據(jù),進行復雜的拓撲計算并寫入新的FeatureClass。為了完成這類任務(wù),請記住以下幾點:

a. 根據(jù)在孤立模型中的線程,你不能在線程之間共享ArcObjects的組件。相反,你需要考慮的是,單個對象都在各自線程中,并在后臺線程中,例如所有工廠需要打開FeatureClass,創(chuàng)造新的FeatureClass,設(shè)置空間參考等等。

b.傳遞給線程的所有信息必須是簡單類型或托管類型的形式。

c.萬一在某種情況下,你要從主線程向工作線程傳遞ArcObjects組件,可以將對象序列化成字符串,再將字符串傳遞給目標線程,然后再反序列化還原到對象。例如,你可以使用XmlSerializerClass序列化對象成為字符串,如工作區(qū)間(Workspace)連接屬性(IPropertySet),再將這一字符串傳遞給目標線程,然后在工作線程中使用XmlSerializerClass反序列化連接屬性。這樣,就將連接屬性對象在后臺再次創(chuàng)造出來,從而避免了跨線程訪問。

當運行后臺線程,你能夠在用戶界面了解任務(wù)的進度。

3.2、實施單機ArcObjects的應(yīng)用程序

正如微軟開發(fā)人員網(wǎng)絡(luò)(MSDN)網(wǎng)站上所說,“在.NET Framework版本2.0中,如果線程的單元狀態(tài)在啟動前尚未確定,新的線程就初始化為ApartmentState.MTA。主應(yīng)用程序線程默認初始化為ApartmentState.MTA。您不能通過設(shè)置代碼的第一行Thread.ApartmentState屬性再設(shè)置主應(yīng)用程序線程到ApartmentState.STA。而應(yīng)使用STAThreadAttribute代替。”

作為ArcObjects的開發(fā)人員,這意味著,如果您的應(yīng)用程序不被視為一個單一線程應(yīng)用程序初始化的,.NET框架將為所有的ArcObjects創(chuàng)建一個特殊的單線程單元(STA)線程,因為他們被標記STA。這將導致對每一個從應(yīng)用程序調(diào)用ArcObjects的線程切換到這個特定的線程上來。反過來,這迫使ArcObjects組件合在一起調(diào)用,并最終以COM組件調(diào)用可能慢了約50倍。幸運的是,這可避免通過簡單地標記主要功能為[STAThread]。

3.3、使用托管線程池和BackgroundWorker的線程

線程池線程都是后臺線程。線程池通過提供一個由系統(tǒng)管理的應(yīng)用程序線程池使你使用線程更有效率。利用為每個任務(wù)創(chuàng)建一個新線程的線程池的優(yōu)點是線程創(chuàng)建和銷毀的開銷是可忽略的,它可以帶來更好的性能和更好的系統(tǒng)穩(wěn)定性。

然而,設(shè)計的所有ThreadPool線程是在多線程單元(MTA),因此不應(yīng)該被用來運行ArcObjects,它們是單線程單元。若要解決此問題,您有幾種選擇。一個是實現(xiàn)一個專用ArcObjects的線程,它被標記為STAThread并委派每個從MTA線程調(diào)用這個專用ArcObjects線程。另一種解決方案是使用自定義的STA線程池的實現(xiàn),如標記為STA線程的線程數(shù)組來運行 ArcObjects。

3.4、同步運行線程的并發(fā)執(zhí)行

在許多情況下,您必須同步執(zhí)行的并發(fā)運行的線程。通常,你要等待一個或多個線程完成他們的任務(wù),當一定條件下得到滿足,一個等待線程的信號恢復其任務(wù),條件如:測試是給定線否程激活和運行,改變線程優(yōu)先級,或給予其他一些條件。

在.NET中有幾種方法來管理運行線程的執(zhí)行。可用來幫助線程管理的主要幾類如下:

System.Threading.Thread;

System.Threading.WaitHandle;

System.Threading.Monitor;

System.Threading.AutoResetEvent and System.Threading.ManualResetEvent。

3.5、在多個線程共享一個托管類型

有時候你的.NET應(yīng)用程序的底層數(shù)據(jù)結(jié)構(gòu)將是一個如DataTable或哈希表管理的對象。這些.NET托管對象允許你在多個線程共享數(shù)據(jù)獲取,如線程和主線程渲染他們。但是,您應(yīng)該咨詢MSDN Web站點以驗證這一點是否是線程安全的。在許多情況下,一個對象是線程讀安全,而寫并不安全。有些集合實施同步方法,它提供了一個底層集合的同步包裝。

在你的對象被多個線程訪問的情況下,根據(jù)MSDN關(guān)于這種情況的對象線程安全規(guī)則,你應(yīng)該獲得一個獨占鎖。取得這樣的獨占鎖能夠完成上面所描述的同步方法,或使用lock語句,它通過獲取給定對象的相互排他鎖標簽一個關(guān)鍵塊。它可以確保,如果另一個線程試圖訪問對象時,它會被阻塞,直到該對象被釋放(退出鎖)。

3.6、從后臺線程更新用戶界面

在大多數(shù)情況下,您正在使用一個后臺線程來執(zhí)行長時間的操作,你想向用戶報告進度,狀態(tài),錯誤或其他與該線程執(zhí)行的任務(wù)相關(guān)的信息。這可以通過更新一個應(yīng)用程序的用戶界面控件來實現(xiàn)。但是,在Windows中,窗體控件綁定到一個特定的線程(通常是主線程),并且不是線程安全的。因此,你必須委派,從而結(jié)合,任何調(diào)用UI控件的線程來控制它的所屬。該委托是通過調(diào)用Control.Invoke方法,該方法在線程上執(zhí)行委托,該委托擁有控件的基礎(chǔ)窗口句柄。要驗證調(diào)用者是否必須調(diào)用Invoke方法,你可以使用屬性Control.InvokeRequired。您必須確保該控件的句柄再嘗試調(diào)用Control.Invoke或Control.InvokeRequired之前已經(jīng)創(chuàng)建。

3.7、從一個線程調(diào)用ArcObjects而不是主線程

在許多多線程應(yīng)用程序中,你將需要從不同線程調(diào)用AO組件。例如,你可能有一個后臺線程來獲取Web服務(wù),這反過來,應(yīng)該增加新的項目到地圖顯示,響應(yīng)更改地圖,或運行的geoprocessing(gp)的工具來執(zhí)行某些類型分析。

一個非常常見的情況是從一個計時器事件處理方法調(diào)用ArcObjects。計時器的Elapsed事件是在一個線程池的任務(wù)提出,這不是一個主線程。然而,它需要使用ArcObjects,這好像是需要跨單元調(diào)用。然而,這可以避免處理ArcObjects的組件,就好像AO組件是一個用戶界面控件和使用Invoke來調(diào)用委派到創(chuàng)建ArcObjects組件的主線程中。因此,沒有跨單元調(diào)用。

ISynchronizeInvoke接口包括的方法有Invoke,BeginInvoke,和EndInvoke。自己實現(xiàn)這些方法可能是一個艱巨的任務(wù)。相反,你應(yīng)該有你直接從System.Windows.Forms.Control繼承的類或者你應(yīng)該有一個助手類,它繼承自控件。要么選擇將提供一個簡單而有效的對于調(diào)用方法的解決方案。

?

delegate SomethingClassType SomeDelegate(IArray array); SomeDelegate del = new SomeDelegate(AnotherFunc);//AnotherFunc與SomeDelegate同樣的形式 IAsyncResult ireslt = del.BeginInvoke(array, null, null);//異步操作 ProgressbarForm form = new ProgressbarForm();//異步操作中的進度條窗體 form.Show(); System.Windows.Forms.Application.DoEvents(); while (!ireslt.IsCompleted) { System.Windows.Forms.Application.DoEvents(); } SomethingClassType something= del.EndInvoke(ireslt); form.Close();

?以上是理論方面的闡述及一個本人開發(fā)過程中的一個代碼片段,希望這些能夠幫助你完成你的多線程程序。參考的資料如下:Windows MSDN,ESRI 的開發(fā)者網(wǎng)站。

?

?

?

總結(jié)

以上是生活随笔為你收集整理的ArcGIS Engine 中的多线程使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 草草视频网站 | 波多野结衣丝袜 | 在线免费观看一区二区 | 先锋资源av网 | 鸥美一级片 | 欧美不卡视频 | 亚洲电影一区二区 | 亚洲天码中字 | 伊人伊人 | 欧美尹人| 波多野结衣中文字幕在线播放 | 中文字幕乱妇无码av在线 | 日韩在线1| 国内精品一区二区 | 亚洲欧美综合精品久久成人 | www.白浆 | 免费看黄av | 精品小视频在线观看 | 黄色av网站在线看 | 性一交一乱一区二区洋洋av | 91亚洲精品久久久蜜桃 | 黄色美女一级片 | 杨贵妃颤抖双乳呻吟求欢小说 | 超碰97人人爱| 老太太av | 国产精品无码粉嫩小泬 | 国产毛片av | 国产大屁股喷水视频在线观看 | 久青草资源福利视频 | 久久伊人热 | 人妻体内射精一区二区三区 | 青青操久久 | 亚洲高清在线观看视频 | www毛片com| 国内自拍99 | 中文字幕人妻一区二区三区 | 91精品人妻一区二区三区蜜桃欧美 | 日韩第一页 | 久久禁| 伊人网在线播放 | 91久久精品一区二区别 | 国产日韩欧美另类 | 4438亚洲 | 黄色字幕网| 日韩精品一区二区三区在线观看 | 伊人国产一区 | 一色综合 | 亚洲欧洲国产视频 | 好色艳妇小说 | 右手影院亚洲欧美 | 在线免费看黄网站 | 九色一区 | 97国产资源 | 亚洲天码中字 | 日本精品免费视频 | 国产精品天美传媒 | 在线免费观看的av | 久久久久久久亚洲av无码 | 本站只有精品 | 日韩av地址 | 色婷婷在线观看视频 | 四虎精品一区 | 欧美一区一区 | 伊人影院99 | 在线a网站 | 操丝袜美女视频 | 欧美日韩综合在线观看 | 天天干天天操天天玩 | 黄色av国产 | 国产精品igao| 久久久国产成人一区二区三区 | 九色蝌蚪9l视频蝌蚪9l视频 | 97超碰导航| 熟妇人妻系列aⅴ无码专区友真希 | 麻豆视频免费在线观看 | 成人深夜福利视频 | 国产69精品久久久久久 | 夜夜草网站 | 久久综合在线 | 久久久国产精品免费 | 男女插插插视频 | 国产麻豆精品一区二区 | 91传媒在线播放 | 中文字幕人成乱码熟女香港 | 美女扒开尿口给男人捅 | 日本精品网 | 精品视频在线观看一区二区 | 91久久精品夜夜躁日日躁欧美 | 婷婷综合精品 | 久久老熟女一区二区三区 | 国产免费三片 | 久久免费精品视频 | 国产精品久久久无码一区 | 久久伊人一区 | 免费中文字幕视频 | aaa在线| 久久久久久国产精品三级玉女聊斋 | 黑人极品videos精品欧美裸 | 欧美xxx性 |