SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

API Code PackとVisual Studio 2008でWindows 7のジャンプリストを作成する

Windowsの簡素化されたミニバージョンの[スタート]メニューを実装

  • X ポスト
  • このエントリーをはてなブックマークに追加

パイプを使った通信

 同一マシン上で実行されている2つのアプリケーション間でメッセージのやり取りが必要になることはよくあります。Windowsではこれをプロセス間通信(IPC)と呼んでおり、IPCを実装する方法がいくつか用意されています。例えば、メモリマップドファイル、TCP/IPソケット、または名前付きカーネルオブジェクトを使うなどの方法があります。また、いわゆる名前付きパイプを使う方法もあります。名前付きパイプは、セキュリティやファイアウォールの設定をいじらずにメッセージを送信できる便利で直接的な方法です。.NETのパイププログラミングも、.NET 3.5の新しいSystem.IO.Pipes名前空間によってさらに簡単になっています。

 サンプルアプリケーションでは、パイプが次のように通信に使われています。サンプルアプリケーションがパラメータなしで起動されると、アプリケーションは普通にユーザーインターフェースを開いて、パイプ接続を待機するスレッドを開始します。

 一方、ユーザーがジャンプリストからコマンドを選択すると、アプリケーションはコマンドラインパラメータ付きで起動されます。この場合、アプリケーションは既存のサーバーアプリケーションのパイプへのパイプ接続を開き、既に実行中のインスタンスにコマンドラインパラメータを送信します。これを受けて、サーバはコマンドに対応する処理を自由に実行できます。

 パイプ処理はPipeCommunicationsカスタムクラスに実装されています。本稿の主題はジャンプリストであって、パイプ通信ではありませんが、ジャンプリストを操作するときにIPCが必要になる場面が多いので、コードをひととおり見ておいて損はありません。サンプルアプリケーションがパラメータなしで起動されると、メインウィンドウのコンストラクタが次のコードを実行します。

PipeCommunications pipes = new PipeCommunications(
  (cmd) =>
  {
     communicationLogTextBox.Invoke(
     new LogMessageToTextBoxDelegate(
        LogMessageToTextBox),cmd);
   });
pipes.CreateListenPipeThread();

 ここでは、パイプ経由で受け取ったコマンドを実際に処理するデリゲートを指定して、PipeCommunicationsクラスを初期化しています。パイプ通信は独立したスレッドで行われるので、スレッド処理の問題を起こさずにユーザーインターフェース要素に正しくアクセスするために、WinFormsコントロールのInvokeメソッドを呼び出す必要があります。ラムダ式を使ってイベントハンドラを作成しています。実際の処理はメインフォームのLogMessageToTextBoxメソッドで行われます。

public delegate void LogMessageToTextBoxDelegate(string cmd);
...
private void LogMessageToTextBox(string cmd)
{
 communicationLogTextBox.Text =
  DateTime.Now.ToLongTimeString() +
  ": Got command: " + cmd + "\r\n" +
  communicationLogTextBox.Text;
}

 この実装では、単に受け取ったコマンドを画面上に記録するだけですが(図7)、独自アプリケーションで何らかの処理を実際に行うことも簡単にできます。例えば、データベースにアクセスしたり、ドキュメントを印刷したり、画面上にダイアログボックスを開いたりできます。

図7 サーバーアプリケーションがパイプ経由でコマンドを受け取っている
図7 サーバーアプリケーションがパイプ経由でコマンドを受け取っている

 メインフォームのコンストラクタによって呼び出されるCreateListenPipeThreadメソッドは、次のコードを実行します。

using System.IO.Pipes;
using System.Threading;
...
Action<string> processCommandAction;
private static AutoResetEvent closeApplicationEvent;
...
internal Thread CreateListenPipeThread()
{
    closeApplicationEvent = new AutoResetEvent(false);
    Thread serverThread = new Thread(
        new ParameterizedThreadStart(
            PipeHandlerServerThread));
    serverThread.Start(serverThread);
    return serverThread;
}

 このコードは、サーバ側のパイプ通信を処理する新しいスレッドを作成します。また、自動リセットイベントを1つ作成します。アプリケーションが終了しようとするときに、Program.csファイルによってこのイベントが通知(設定)されます。このようなイベントを使わないと、メインフォームは正常に閉じても、パイプスレッドが実行されたままになります。従って、アプリケーションを完全に閉じるためにスレッドを正しく終了する必要があります。

次のページ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Jani Jarvinen(Jani Jarvinen)

フィンランドのソフトウェア開発トレーナー兼コンサルタント。Microsoft C# MVPの受賞者で、投稿も多数。ソフトウェア開発に関する著書も3冊出版している。ITpro.fiというフィンランドのソフトウェア開発エキスパートグループのグループリーダー。ブログのアドレスはhttp://www.saunalahti.fi/janij/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4826 2010/02/17 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング