- PR -

クラス内部で別スレッドからメインスレッドにマーシャリングする方法

投稿者投稿内容
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-10-17 14:00
引用:

渋木宏明(ひどり)さんの書き込み (2005-10-17 13:30) より:
MSDN 的に、「マーシャリング」を期待して BeginInboke, Invoke を使わせている場面てありましたっけ?

BeginInvoke, Invoke は PostMessage, SendMessage のマネージ実装で、これらに期待されているのは「適切なコンテキストスイッチを伴うウィンドウプロシージャの呼び出し」だと思うのですが。。。


いや、厳密な意味?での「マーシャリング」を期待してInvokeを使っているということではなくて、Invokeを使うようなことを「マーシャリング」と表現している、という意味です。

※私はこの辺り正確なことは知らないので、受け取り方に語弊があるかもしれませんが。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-10-17 15:08
引用:

Invokeを使うようなことを「マーシャリング」と表現している、という意味です。



そんな場面ってありましたっけ?

Control.Invoke() のヘルプでは

--ここから--
コントロールの基になるウィンドウハンドルを所有するスレッド上で、指定したデリゲートを実行します。
--ここまで--

と説明されていて、「マーシャリング」という用語は出てきてないようなんですが。。。

# よく見ると、このヘルプトピックも少し冗長な表現ですね。
# ウィンドウハンドルを「所有」するだけなら、どのスレッドにもできるじゃん!って思ってしまう。。。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-10-17 16:40
引用:

渋木宏明(ひどり)さんの書き込み (2005-10-17 15:08) より:
そんな場面ってありましたっけ?

Control.Invoke() のヘルプでは

--ここから--
コントロールの基になるウィンドウハンドルを所有するスレッド上で、指定したデリゲートを実行します。
--ここまで--

と説明されていて、「マーシャリング」という用語は出てきてないようなんですが。。。


ええと、その中のオーバーロードの内容の方ですかね(一覧でなくて)。
あとはコントロールの作成関係?とかのドキュメントで触れられている部分があるような感じです。
※この辺「だけ」見ると、ごく当たり前のようにマーシャリングという用語を使っているように見えます。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-10-17 22:07
UIスレッドが持ってる処理待ち列に処理を整列させてるイメージでmarshalって言ってるんじゃないですか?
.NETの用語ではなく一般的な動詞として。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-10-17 23:41
引用:

UIスレッドが持ってる処理待ち列に処理を整列させてるイメージでmarshalって言ってるんじゃないですか?
.NETの用語ではなく一般的な動詞として。



なるほど、それなら納得です。

# 原文見てみよ>おれ

ただ、その場合でも「(処理や呼び出しを)シリアライズする」ってな表現の方が馴染むなぁ>自分

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-10-17 23:56
引用:

kanaiさんの書き込み (2005-10-14 08:57) より:

MSDN「マルチスレッド Windows フォーム コントロールのサンプル」
引用:

STA モデルでは、コントロールを作成したスレッドの外部から呼び出される必要があるすべてのメソッドを、そのコントロールの作成スレッドにマーシャリングする (そのコントロールの作成スレッドで実行する) 必要があります。基本クラス Control には、この目的のためのメソッド (Invoke、BeginInvoke、および EndInvoke) が用意されています。Invoke は同期メソッド呼び出しを実行し、BeginInvoke は非同期メソッド呼び出しを実行します。



から、「あるスレッドでのメソッド呼び出しを別のスレッド上で実行すること」を「マーシャリング」だと理解していました。


確かに、そのように読めますね。

ちなみに、以下は上記 MSDN トピック引用部分の原文です↓。

引用:

The STA model requires that any methods on a control that need to be called from outside the control's creation thread must be marshaled to (executed on) the control's creation thread. The base class Control provides several methods (Invoke, BeginInvoke, and EndInvoke) for this purpose. Invoke makes synchronous method calls; BeginInvoke makes asynchronous method calls.


英語はからっきしなんでアレですが、専門用語の「マーシャリング」ではない本来の、あるいはまた、そこから派生したちょっと違った意味合いとかで、こういう言い回しってするもんなんでしょうか…?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-10-19 23:08
引用:

英語はからっきしなんでアレですが、専門用語の「マーシャリング」ではない本来の、あるいはまた、そこから派生したちょっと違った意味合いとかで、こういう言い回しってするもんなんでしょうか…?



よく使う言い回しなのかどうかは分かりませんが、普通に動詞として使ってるように見えます>marshaled
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-19 23:41
横からごめんんなさい。

引用:

The STA model requires that any methods on a control that need to be called from outside the control's creation thread must be marshaled to (executed on) the control's creation thread. The base class Control provides several methods (Invoke, BeginInvoke, and EndInvoke) for this purpose. Invoke makes synchronous method calls; BeginInvoke makes asynchronous method calls.




メソッドの場合はInvokeなど、Windows的に明確にインタフェースを指定された呼び出しをする必要がある。

データの場合のマーシャリングの場合は一般的にシリアライズという表現を使う。

マーシャリングというのは、スレッド境界を越えるための必要要件で
InvokeやSeliarizeというのはそのための手段だと私は解釈しましたが、いかがなものでしょうか?


スキルアップ/キャリアアップ(JOB@IT)