DOBON.NETプログラミング掲示板過去ログ
IPCで待ち状態にする
題名: IPCで待ち状態にする
著者: 彩
URL:
http://d.hatena.ne.jp/tetsuarossa/searchdiary?word=*%5BC%23%5D
日時: 2007/07/02 15:54:02
ID: 19990
この記事の返信元:
(なし)
この記事への返信:
[19991]
Re[1]: IPCで待ち状態にする
しろ
2007/07/02 15:58:42
ツリーを表示
環境/言語:[C#,VisualStudio2005,.NET Framework2.0]
分類:[.NET]
URLで書かして頂いたホームページの
「.NETリモーティングを使ったプロセス間通信」の箇所で、
実際に動かしてみました。
一応、動作は分かりました。
しかし、やりたい事というのが少し違っていました。
まず始めに、
ServerForm,ClientForm,RemoteMessageという風に、
ホームページのコンソール版をwindows版(フォームを加えたような状態)に変更しました。
ソースは以下のような感じです。
-----------サーバー-------------
namespace RemoServer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static void msg_eventCall(string str)
{
MessageBox.Show(str);
}
private void Form1_Shown(object sender, EventArgs e)
{
// IPC Channelを作成
IpcServerChannel servChannel = new IpcServerChannel("remote");
// リモートオブジェクトを登録
ChannelServices.RegisterChannel(servChannel, true);
// ChannelのURIを表示
Console.WriteLine("Listening on {0}", servChannel.GetChannelUri());
// イベントを登録
RemoteMessage msg = new RemoteMessage();
msg.eventCall += new RemoteMessage.CallHandler(msg_eventCall);
RemotingServices.Marshal(msg, "message", typeof(RemoteMessage));
}
}
}
-----------クライアント-------------
namespace RemoClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// IPC Channel を作成
IpcClientChannel clientChannel = new IpcClientChannel();
// リモートオブジェクトを登録
ChannelServices.RegisterChannel(clientChannel, true);
// オブジェクトを作成
RemoteMessage msg = (RemoteMessage)Activator.GetObject(typeof(RemoteMessage), "ipc://remote/message");
msg.Call("テスト");
//ここでサーバーが閉じるまで処理を待ちたい
MessageBox.Show("クライアント終了");
}
}
}
---------共通クラス-------------
namespace RemoServer
{
public class RemoteMessage : MarshalByRefObject
{
public delegate void CallHandler(string str);
public event CallHandler eventCall;
public void Call(string str)
{
eventCall(str);
}
}
}
-----------------------------------------
このような感じです。
この場合、
サーバー起動→クライアント起動→クライアントのボタンクリック→共通クラス処理が動く→サーバーのメッセージボックスが立ち上がる→またクライアントに処理が戻る。
となるのですが、
今回やりたい事は、
サーバー起動→クライアント起動→クライアントのボタンクリック→共通クラス処理が動く→サーバーのメッセージボックスが立ち上がる→
(ここからが異なる)クライアントはサーバーが閉じるまで処理をまつ→サーバーの画面を閉じる→クライアントに処理が戻る
という事をしたいのです。
(Process.WaitForExit()のイメージです)
今のままではすぐにクライアント側に処理が戻ってしまい、思っている動きになりません。
whileループで待つという方法を一応は考えたのですが、
今回のプログラムでは、RemoServerはタスクトレイに常駐する形を取るので、使えませんでした。
------------不採用-------------
while(true)
{
//サーバーが終了するまでループ
if (Process.GetProcessesByName("RemoServer").Length == 0)
{
break;
}
}
-------------------------------
IPCリモーティングで待ち状態にする方法で何かありましたらアドバイスください。
よろしくお願いします。
題名: Re[1]: IPCで待ち状態にする
著者: しろ
日時: 2007/07/02 15:58:42
ID: 19991
この記事の返信元:
[19990]
IPCで待ち状態にする
彩
2007/07/02 15:54:02
この記事への返信:
(なし)
ツリーを表示
2007/07/02(Mon) 16:09:39 編集(投稿者)
お世話になっております
実際に動かした訳ではなく、
投稿を読んだだけですので的外れだったらごめんなさい。
ThreadもしくはBackgroundWorkerを使って
whileループするのはダメなのですか?
DOBON.NET
|
プログラミング道
|
プログラミング掲示板
分類:[.NET]
URLで書かして頂いたホームページの
「.NETリモーティングを使ったプロセス間通信」の箇所で、
実際に動かしてみました。
一応、動作は分かりました。
しかし、やりたい事というのが少し違っていました。
まず始めに、
ServerForm,ClientForm,RemoteMessageという風に、
ホームページのコンソール版をwindows版(フォームを加えたような状態)に変更しました。
ソースは以下のような感じです。
-----------サーバー-------------
namespace RemoServer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static void msg_eventCall(string str)
{
MessageBox.Show(str);
}
private void Form1_Shown(object sender, EventArgs e)
{
// IPC Channelを作成
IpcServerChannel servChannel = new IpcServerChannel("remote");
// リモートオブジェクトを登録
ChannelServices.RegisterChannel(servChannel, true);
// ChannelのURIを表示
Console.WriteLine("Listening on {0}", servChannel.GetChannelUri());
// イベントを登録
RemoteMessage msg = new RemoteMessage();
msg.eventCall += new RemoteMessage.CallHandler(msg_eventCall);
RemotingServices.Marshal(msg, "message", typeof(RemoteMessage));
}
}
}
-----------クライアント-------------
namespace RemoClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// IPC Channel を作成
IpcClientChannel clientChannel = new IpcClientChannel();
// リモートオブジェクトを登録
ChannelServices.RegisterChannel(clientChannel, true);
// オブジェクトを作成
RemoteMessage msg = (RemoteMessage)Activator.GetObject(typeof(RemoteMessage), "ipc://remote/message");
msg.Call("テスト");
//ここでサーバーが閉じるまで処理を待ちたい
MessageBox.Show("クライアント終了");
}
}
}
---------共通クラス-------------
namespace RemoServer
{
public class RemoteMessage : MarshalByRefObject
{
public delegate void CallHandler(string str);
public event CallHandler eventCall;
public void Call(string str)
{
eventCall(str);
}
}
}
-----------------------------------------
このような感じです。
この場合、
サーバー起動→クライアント起動→クライアントのボタンクリック→共通クラス処理が動く→サーバーのメッセージボックスが立ち上がる→またクライアントに処理が戻る。
となるのですが、
今回やりたい事は、
サーバー起動→クライアント起動→クライアントのボタンクリック→共通クラス処理が動く→サーバーのメッセージボックスが立ち上がる→
(ここからが異なる)クライアントはサーバーが閉じるまで処理をまつ→サーバーの画面を閉じる→クライアントに処理が戻る
という事をしたいのです。
(Process.WaitForExit()のイメージです)
今のままではすぐにクライアント側に処理が戻ってしまい、思っている動きになりません。
whileループで待つという方法を一応は考えたのですが、
今回のプログラムでは、RemoServerはタスクトレイに常駐する形を取るので、使えませんでした。
------------不採用-------------
while(true)
{
//サーバーが終了するまでループ
if (Process.GetProcessesByName("RemoServer").Length == 0)
{
break;
}
}
-------------------------------
IPCリモーティングで待ち状態にする方法で何かありましたらアドバイスください。
よろしくお願いします。