Async.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file Async.py
00006 # @brief Asynchronous function invocation helper class
00007 # @date $Date$
00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00009 #
00010 # Copyright (C) 2009
00011 #     Task-intelligence Research Group,
00012 #     Intelligent Systems Research Institute,
00013 #     National Institute of
00014 #         Advanced Industrial Science and Technology (AIST), Japan
00015 #     All rights reserved.
00016 #
00017 # $Id$
00018 #
00019 #
00020 
00021 import threading
00022 import OpenRTM_aist
00023 
00024 
00025 class Async_t(OpenRTM_aist.Task):
00026 
00027   def __init__(self, obj, func, *args):
00028     OpenRTM_aist.Task.__init__(self)
00029     self._obj        = obj
00030     self._func       = func
00031     self._finished   = False
00032     self._args       = args
00033     self._mutex      = threading.RLock()
00034 
00035   def invoke(self):
00036     self.activate()
00037 
00038 
00039   def finished(self):
00040     guard = OpenRTM_aist.ScopedLock(self._mutex)
00041     return self._finished
00042 
00043 
00044   def svc(self):
00045     if len(self._args) > 0:
00046       self._func(self._obj, self._args)
00047     else:
00048       self._func(self._obj)
00049 
00050     guard = OpenRTM_aist.ScopedLock(self._mutex)
00051     self._finished = True
00052     return 0
00053 
00054 
00055 class Async_ref_t(OpenRTM_aist.Task):
00056 
00057   def __init__(self, obj, func, *args):
00058     OpenRTM_aist.Task.__init__(self)
00059     self._obj        = obj
00060     self._func       = func
00061     self._args       = args
00062     self._finished   = False
00063     
00064 
00065   def invoke(self):
00066     self.activate()
00067 
00068 
00069   def finished(self):
00070     return self._finished
00071   
00072 
00073   def svc(self):
00074     if len(self._args) > 0:
00075       self._func(self._obj, self._args)
00076     else:
00077       self._func(self._obj)
00078 
00079     self._finished = True
00080     return 0
00081   
00082   
00083 ##
00084 # @if jp
00085 # @brief 非同期メンバー関数呼び出しヘルパー関数
00086 #
00087 # メンバー関数を非同期に呼ぶためのヘルパー関数
00088 # 例
00089 #
00090 #  class A
00091 #  {
00092 #  public:
00093 #    // 時間のかかる関数
00094 #    void hoge() {
00095 #      for (int i(0); i < 5; ++i) {
00096 #        std::cout << "hoge" << std::endl;
00097 #        sleep(1);
00098 #      }
00099 #    }
00100 #    // 時間のかかる関数
00101 #    void munya(const char* msg) {
00102 #      for (int i(0); i < 10; ++i) {
00103 #        std::cout << "message is: " << msg << std::endl;
00104 #        sleep(1);
00105 #      }
00106 #    }
00107 #    int add_one(int val) {
00108 #      return val + 1;
00109 #    }
00110 #  };
00111 # この様なクラスのオブジェクトに対して、
00112 #
00113 #  A a;
00114 #  Async* invoker0(AsyncInvoker(&a,
00115 #                               std::mem_fun(&A::hoge)));
00116 #  Async* invoker1(AsyncInvoker(&a,
00117 #                               std::bind2nd(std::mem_fun(&A::munya),
00118 #                                            "ほげ")));
00119 #  invoker0->invoke(); // すぐに戻る
00120 #  invoker1->invoke(); // すぐに戻る
00121 #
00122 #  delete invoker0; // 必ず削除すること
00123 #  delete invoker1; // 必ず削除すること
00124 #
00125 # のように非同期の呼び出しができる。
00126 # 呼び出しの戻り値を取得したい場合は、自前の関数オブジェクトを用意する。
00127 #
00128 #  class add_one_functor
00129 #  {
00130 #    int m_val, m_ret;
00131 #  public:
00132 #    add_one_functor(int val) : m_val(val), m_ret(0) {}
00133 #    void operaotr(A* obj) {
00134 #      m_ret = obj->add_one(m_val);
00135 #    }
00136 #    int get_ret() {
00137 #      return m_ret;
00138 #    }
00139 #  };
00140 #
00141 # 上記の関数オブジェクトのインスタンスを作成し、そのポインタを渡す。
00142 #
00143 #  add_one_functor aof(100);
00144 #  Async* invoker2(AsyncInvoker(&a, &aof));
00145 #  invoker2->invoke();
00146 #  invoker2->wait();
00147 #  std::cout << "result: " << aof.get_ret() << std::endl;
00148 #  delete invoker2;
00149 #
00150 # 通常、AsyncInvoker が返すオブジェクトは明示的に削除しなければ
00151 # ならないが、第三引数に true を渡すことで、非同期実行が終了すると同時に
00152 # 自動的にインスタンスが削除される。
00153 #
00154 # // invoker3 は削除 (delete invoker3) してはいけない
00155 # Async* invoker3(AsyncInvoker(&a, std::mem_fun(&A::hoge), true));
00156 #
00157 # // インスタンス生成と同時に実行することもできる。
00158 # AsyncInvoker(&a, std::mem_fun(&A::hoge))->invoke();
00159 #
00160 # @else
00161 #
00162 # @endif
00163 #
00164 #def Async_tInvoker(func, auto_delete = False):
00165 def Async_tInvoker(obj, func, *args):
00166   return Async_t(obj, func, *args)
00167 
00168 
00169 def Async_ref_tInvoker(obj, func, *args):
00170   return Async_ref_t(obj, func, *args)


openrtm_aist_python
Author(s): Shinji Kurihara
autogenerated on Thu Aug 27 2015 14:17:28