異步方法一旦開始,方法調用就會當即返回,調用者就能夠繼續後續的操做。異步方法一般會在另一個線程中,「真實」地執行着。整個過程,不會阻礙調用者的工做。算法
PIE SDK支持算法功能的執行,下面對算法的異步調用功能進行介紹。異步
AlgoFactory類實現了算法的管理,主要實現瞭如下方法:ide
1) AlgoFactory.Instance().CreateAlgo(A,B)實現算法Algo的建立;須要注意的是:A:「PIE.CommonAlgo.dll」,B: "PIE.CommonAlgo.ImageClipAlgo"。spa
2) 設置算法的參數;線程
3) 經過AlgoFactory.Instance().AsynExcuteAlgo(algo)實現異步調用。3d
ISystemAlgoEvents接口是算法進度變化事件接口,用來管理算法執行進度變化( OnProgressChangedEvent )以及執行完成( OnExcuteCompletedEvent )事件。code
第一步視頻 |
算法建立CreateAlgo;blog |
第二步教程 |
設置算法參數; |
第三步 |
異步執行AsynExcuteAlgo; |
第四步 |
編寫算法執行完成事件 |
第五步 |
編寫算法進度變化事件 |
項目路徑 |
百度雲盤地址下/PIE示例程序/10.算法調用/算法的調用方式/Algo.AsynExecute |
數據路徑 |
百度雲盤地址下/PIE示例數據/柵格數據/01.GF1/ MS.tif |
視頻路徑 |
百度雲盤地址下/PIE視頻教程/10.算法調用/算法的調用方式/算法的異步調用.avi |
示例代碼 |
|
![]() 1 /// <summary> 2 /// 單擊方法 3 /// </summary> 4 public override void OnClick() 5 { 6 //Clip裁剪 7 PIE.CommonAlgo.DataPreImgClip_Exchange_Info info = new PIE.CommonAlgo.DataPreImgClip_Exchange_Info(); 8 9 info.InputFilePath = @"D:\Data\GF1_ortho.tif"; //待裁剪影像 10 PIE.DataSource.IRasterDataset rDataset = PIE.DataSource.DatasetFactory.OpenRasterDataset(info.InputFilePath, PIE.DataSource.OpenMode.ReadOnly); 11 if (rDataset == null) return; 12 int count = rDataset.GetBandCount(); 13 List<int> list = new List<int> { }; 14 for (int i = 0; i < count; i++) 15 { 16 17 list.Add(i); 18 } 19 info.listBands = list; 20 info.XFactor = 1; 21 info.YFactor = 1; 22 info.bInvalidValue = false; 23 info.OutputFilePath = @"D:\Data\clip_AsynExecute.tif"; //裁剪保存結果 24 info.Type = 0; // (等於0表示經過柵格範圍裁剪) 25 info.XStart = 0; 26 info.XEnd = 2000; 27 info.YStart = 0; 28 info.YEnd = 2000; 29 info.FileType = "GTiff"; //Tiff數據的FileTypeCode爲「GTiff」,IMG數據的FileTypeCode爲"HFA",其餘格式的爲"ENVI"。; 30 31 //一、初始實例化Instance,算法建立CreateAlgo 32 PIE.SystemAlgo.ISystemAlgo algo = PIE.SystemAlgo.AlgoFactory.Instance().CreateAlgo("PIE.CommonAlgo.dll", "PIE.CommonAlgo.ImageClipAlgo"); 33 if (algo == null) return; 34 35 //二、異步執行AsynExcuteAlgo 36 PIE.SystemAlgo.ISystemAlgoEvents algoEvents = algo as PIE.SystemAlgo.ISystemAlgoEvents; 37 algo.Name = "影像裁剪"; 38 algo.Params = info; 39 algoEvents.OnExecuteCompleted += OnAlgoExcuteCompleted; 40 algoEvents.OnProgressChanged += OnAlgoProgressChanged; 41 42 PIE.AxControls.IStatusBar statusBar = m_Application.StatusBar; 43 statusBar.ShowProgress(0, 100, ""); 44 PIE.SystemAlgo.AlgoFactory.Instance().AsynExecuteAlgo(algo); 45 } 46 47 /// <summary> 48 /// 三、算法執行完成事件 49 /// </summary> 50 /// <param name="algo">算法</param> 51 private void OnAlgoExcuteCompleted(PIE.SystemAlgo.ISystemAlgo algo) 52 { 53 PIE.AxControls.IStatusBar statusBar = m_Application.StatusBar; 54 statusBar.UpdateProgress(100, ""); 55 statusBar.HideProgress(); 56 57 PIE.Carto.ILayer layer = PIE.Carto.LayerFactory.CreateDefaultLayer(@"D:\Data\clip_AsynExecute.tif"); 58 m_HookHelper.FocusMap.AddLayer(layer); 59 m_HookHelper.ActiveView.PartialRefresh(PIE.Carto.ViewDrawPhaseType.ViewAll); 60 61 PIE.SystemAlgo.ISystemAlgoEvents algoEvents = algo as PIE.SystemAlgo.ISystemAlgoEvents; 62 algoEvents.OnExecuteCompleted -= OnAlgoExcuteCompleted; 63 algoEvents.OnProgressChanged -= OnAlgoProgressChanged; 64 } 65 66 /// <summary> 67 /// 四、算法進度變化事件 68 /// </summary> 69 /// <param name="complete">進度</param> 70 /// <param name="msg">進度信息</param> 71 /// <param name="algo">算法</param> 72 /// <returns>int</returns> 73 private int OnAlgoProgressChanged(double complete, string msg, PIE.SystemAlgo.ISystemAlgo algo) 74 { 75 PIE.AxControls.IStatusBar statusBar = m_Application.StatusBar; 76 statusBar.UpdateProgress((int)complete, msg); 77 return 0; 78 } |
算法的異步調用
算法的執行狀況顯示