スレッド操作の結論


レス

解決できたようでネタ提供ありがとうございます。
————————————————————————————
ネタをもらったので自分なりに解釈。

http://edndoc.esri.com/arcobjects/9.2/net/2c2d2655-a208-4902-bf4d-b37a1de120de.htm

http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Writing_multithreaded_ArcObjects_code/000100000100000000/

InvokeはControlからの継承なので、何も無いときはControl継承作るのがまあ正しいか。

Formクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form%28v=vs.110%29.aspx

Controlクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control%28v=vs.110%29.aspx

こんな感じで解決してもらった模様。

//InvokeHelperクラス
public sealed class InvokeHelper : Control
{
  public delegate void MessageHandler(string param);
  private IActiveView m_activeView;
  private AddLayerExtension m_myExtention;

  //コンストラクタ
  public InvokeHelper(IActiveView activeView, AddLayerExtension myExtention)
  {
    this.CreateHandle();
    this.CreateControl();
    this.m_activeView = activeView;
    this.m_myExtention = myExtention;
  }

  //実行
  public void InvokeMethod(string param)
  {
    if (!this.IsDisposed && this.IsHandleCreated)
    {
      this.Invoke(new MessageHandler(delegate(string _param)
      {
        //AddLayerを行う
        this.m_myExtention.AddLayer(_param);
      }), new object[] { param });
    }//end if
  }//end method
}///end class

//エクステンションクラス
public class AddLayerExtension : ESRI.ArcGIS.Desktop.AddIns.Extension
{
  //レイヤ追加
  public void AddLayer(string param)
  {
    //:::レイヤ作成処理とか
    map.AddLayer(layer);
  }
}//end class

Invokeの中身見てみるがまあControl使うのが妥当か。
http://www.dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/whidbey/REDBITS/ndp/fx/src/WinForms/Managed/System/WinForms/Control@cs/8/Control@cs

ちなみにスレッド分けた先のCOMインスタンス持ってくるときとか渡すときは永続化等が必要  (MemoryStreamでByte配列でもいいが結局バイナリ化コスト)
https://jpusergis.wordpress.com/2014/04/10/persist/
あんまり気軽にスレッド分けても速くならない仕様なのでスレッド分割は使いどころが難しい

カテゴリー: 開発 タグ: パーマリンク