- PR -

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

投稿者投稿内容
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 2005-10-14 08:57
渋木さん、まどかさんご回答ありがとうございます。

引用:

それって「マーシャリング」なんだっけ?



すみません。「マーシャリング」の正しい定義をよく知らずに使用してしまった
かもしれません。

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

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



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

引用:

イベントハンドラとデリゲートプロシージャを記述するのは同じ負担ですよね。



高度なユーザーにとっては同じ負担、と言えますが、私が対象と考えるユーザーは
いわゆる普通のVBユーザー(主にVB6からの)とお考えください。
#かくいう私もその一人ですが・・・
VB6には「イベント」はありますが、「デリゲート」という概念はないので、
イベントのほうがなじみやすい、というだけです。

引用:

私も気になってました。
あと、「フォーム側で」っていうのも。



すみません。「フォーム側で」という記述が、どのように気になられたのでしょうか?

まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-10-14 10:41
引用:

引用:

私も気になってました。
あと、「フォーム側で」っていうのも。


すみません。「フォーム側で」という記述が、どのように気になられたのでしょうか?


日本語は難しいなぁというところでしょうか。

引用:

このような場合、フォーム側でInvokeを使用してコントロールの操作が
メインスレッド上で行われるようにする必要がある、と理解していますが、


第一印象で、フォーム側にInvokeが記述されてるように思いました。
それだけですので、ご心配になられましたらすいません。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-10-14 11:21
こんにちは。

引用:

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

すみません。「マーシャリング」の正しい定義をよく知らずに使用してしまった
かもしれません。




マーシャリング(marshaling)とは…

RPCなどのプロセス境界やマシン境界を越えるメソッドの呼び出しで、
引数や戻り値のデータを正しく橋渡しをするために、整列(隊列)させて転送するための仕組みですね。
プロセス間で参照やポインタを受け渡ししても、メモリ空間が違うため意味をなさないですから。
#間違っていたら訂正おねがいします。

ASCII24 - アスキー デジタル用語辞典 - マーシャリング
RPC(Remote Procedure Call)


#RPCのリンク追加


[ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2005-10-14 11:51 ]
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 2005-10-14 18:39
まどかさん、Tdnr_Symさんご回答ありがとうございます。

引用:

第一印象で、フォーム側にInvokeが記述されてるように思いました。
それだけですので、ご心配になられましたらすいません。



仰る通り、初めはフォーム側にInvokeを記述していましたが・・・
現在は、SynchronizingObjectプロパティを実装することで、
フォーム側ではInvoke不要にすることが出来ました。

引用:

RPCなどのプロセス境界やマシン境界を越えるメソッドの呼び出しで、
引数や戻り値のデータを正しく橋渡しをするために、整列(隊列)させて転送するための仕組みですね。



解説いただきありがとうございます。
「マーシャリング」という言葉自体はもっと広い意味で使用するようですね。
「スレッド間のマーシャリング」というように限定して使用すれば一応正しい、
と受け止めましたがいかがでしょうか?

また、デザイナで"SynchronizingObject = Me"が自動設定される件ですが、
下記のようにすれば可能なようでした。本題とは関係ありませんが一応コードを
転記します。

コード:
'Class1.vb
Imports System.ComponentModel.Design

Public Class Class1
    Inherits System.ComponentModel.Component

    '略

    'マーシャリング用オブジェクト
    Private _SynchronizingObject As System.ComponentModel.ISynchronizeInvoke

    Public Property SynchronizingObject() As System.ComponentModel.ISynchronizeInvoke
        Get
            'SynchronizingObjectが未設定で、デザインモードのとき
            If _SynchronizingObject Is Nothing And Me.DesignMode Then
                Dim designer As IDesignerHost = _
                    CType(Me.GetService(GetType(IDesignerHost)), IDesignerHost)
                'デザイナが取得できたとき
                If Not (designer Is Nothing) Then
                    'SynchronizingObjectにデザイナのRootComponentを設定
                    _SynchronizingObject = _
                        CType(designer.RootComponent, System.ComponentModel.ISynchronizeInvoke)
                End If
            End If
            Return _SynchronizingObject
        End Get
        Set(ByVal Value As System.ComponentModel.ISynchronizeInvoke)
            _SynchronizingObject = Value
        End Set
    End Property

    '略

End Class


Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-10-15 11:12
kanaiさん、こんにちは。

引用:

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

解説いただきありがとうございます。
「マーシャリング」という言葉自体はもっと広い意味で使用するようですね。
「スレッド間のマーシャリング」というように限定して使用すれば一応正しい、
と受け止めましたがいかがでしょうか?



う〜ん?
やはり、腑に落ちません。
そもそも同一プロセスのスレッド間で「マーシャリング」する必要はあるのでしょうか?
なんの目的で「マーシャリング」が必要なのでしょうか?

ご提示されたサンプルコードを拝見してもマーシャリングしているところが見当たらないのですが…

kanaiさんの「マーシャリング」というの言葉の使い方は、
「(スレッド間で)同期呼び出しを行う」という意味で使われているように思います。
 invoke(呼び出し)
 synchronous(同期)
 asynchronous(非同期)
です。

"marshal" を英和辞書で調べていただければ分かると思いますが、もともと "整列する" という意味です。
「(異なるシステム境界で)データを”整列”させて転送する」ことをマーシャリングと呼びます。
その逆に「受け取ってデコードする(”整列”の逆の処理をする)」ことをアンマーシャリングと呼びます。

.NET Frameworkで言えば、System.MarshalByRefObjectクラスやSerializable属性の辺りを使うことになると思います。

以上でどうでしょうか?
#間違いがあればご指摘をお願いします。


スレッドのご質問が解決されているなら、
べつに言葉なんてどうでもいいですね(~_~;)

#「Serializable属性」追加

[ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2005-10-15 14:20 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2005-10-17 11:30
引用:

Tdnr_Symさんの書き込み (2005-10-15 11:12) より:
kanaiさん、こんにちは。

引用:

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

解説いただきありがとうございます。
「マーシャリング」という言葉自体はもっと広い意味で使用するようですね。
「スレッド間のマーシャリング」というように限定して使用すれば一応正しい、
と受け止めましたがいかがでしょうか?



う〜ん?
やはり、腑に落ちません。
そもそも同一プロセスのスレッド間で「マーシャリング」する必要はあるのでしょうか?
なんの目的で「マーシャリング」が必要なのでしょうか?

ご提示されたサンプルコードを拝見してもマーシャリングしているところが見当たらないのですが…

kanaiさんの「マーシャリング」というの言葉の使い方は、
「(スレッド間で)同期呼び出しを行う」という意味で使われているように思います。
 invoke(呼び出し)
 synchronous(同期)
 asynchronous(非同期)
です。


なんで使っているかといえば、MSDNで使っているからではないんでしょうか?
つまりMS的にはこういう「処理の整列」もマーシャリングって呼ぶという。
単語自体は整列させるといった意味なのですから、別に対象がデータだろうが処理だろうがおかしくはないのではないでしょうか?

もちろん、デジタル用語的?には、おっしゃる意味が一般的なのかもしれませんが。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2005-10-17 12:37
なちゃさん、こんにちは。

引用:

なんで使っているかといえば、MSDNで使っているからではないんでしょうか?
つまりMS的にはこういう「処理の整列」もマーシャリングって呼ぶという。
単語自体は整列させるといった意味なのですから、別に対象がデータだろうが処理だろうがおかしくはないのではないでしょうか?

もちろん、デジタル用語的?には、おっしゃる意味が一般的なのかもしれませんが。



確かに「処理の整列」と捉えれば、表現はおかしくないですね。
なんだか、MSDNの日本語訳がマズイんじゃないかと思うのですが…(~_~;)

ついでに、MSDN的「マーシャリング」の定義は、
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpmsaa/htm/editMSAAv2_11_5.asp

引用:

Marshaling
 Packaging and sending interface parameters across process boundaries.



訳しますと

”マーシャリング
 プロセス境界を越えて、インターフェイスのパラメータをパッケージ化して送ること。”

となっているようです。


渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-10-17 13:30
引用:

なんで使っているかといえば、MSDNで使っているからではないんでしょうか?



MSDN 的に、「マーシャリング」を期待して BeginInboke, Invoke を使わせている場面てありましたっけ?

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

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