連載 .NETでWindowsアプリを作ろう

第3回 画像検索ツール本体をマルチスレッドで作ろう

デジタルアドバンテージ 遠藤 孝信
2005/10/29
Page1 Page2 Page3 Page4


Back Issue
1
Google画像検索アプリを作ろう
2
サムネイル画像コントロールを作ろう

 本連載では「Web画像検索ツール」を作りながら、.NETによるWindowsアプリケーションのプログラミングについて解説しています。

 連載第1回では、Googleイメージ検索で検索を行い、見つかった画像のURLを取得する「Google用プラグイン」を作成しました。また、第2回では、検索により取得した画像を一覧表示するための「サムネイル画像コントロール」を作成しました。

 今回は、これらの2つのコンポーネントを使用するアプリケーション本体を作成していきます。アプリケーション本体では、ユーザーが入力した検索キーワードを受け取り、Google用プラグインでGoogleを検索し、検索結果のURLで示される画像をダウンロードしてから、サムネイル画像コントロールに追加していきます。

今回作成するWeb画像検索ツールの実行画面
今回はGoogle検索専用として、このアプリケーションを作成する。次回ではプラグインを選択して複数のサイトから検索を行えるようにする。

 今回のポイントとなるのは、マルチスレッドによりGUI操作と検索処理を並行して行うところです。

 マルチスレッドを利用せずにストレートにコーディングしてしまうと、検索を開始してからすべての検索結果を取得するまでの間はアプリケーションが操作できなくなってしまいます。これは、アプリケーションが検索処理にかかりきりになり、検索処理中はGUI部品であるボタンやスクロールバーの処理が実行されないためです。Googleによる検索がいくら速いといってもこれでは不便です。

 今回は、以下の処理を別スレッドで実行するようプログラミングしていきます。

  • Google用プラグインによる検索
  • サムネイル画像のダウンロード
  • サムネイル画像コントロールへのサムネイル画像の追加

 本稿では、これらの処理を行うスレッドを「検索スレッド」と呼ぶことにします。これに対して、本来のスレッド*を「UIスレッド」と呼びます。画像の検索中は検索スレッドとUIスレッドが並行して実行されることになります。

* Windowsでは、すべての処理はスレッドとして実行されます。1つのアプリケーションは少なくとも1つのスレッドを持つことになります。

プロジェクトの設定

 プログラミングを開始する前に、アプリケーションのプロジェクトを設定しておく必要があります。ここではプロジェクトの参照設定と、サムネイル画像コントロールの登録を行います。

 まずは、連載第1回目で作成した「今回作成する3つのプロジェクト(Google検索部分)」(C#版VB.NET版)を展開してください。zipファイルには次の3つのフォルダが含まれています。

  • WebImageLib(ビルドするとWebImageLib.dllが作成される)
  • WebImageSearch(ビルドするとWebImageSearch.exeが作成される)
  • WISGoogle(ビルドするとWISGoogle.dllが作成される)

 WebImageSearchフォルダを開いて、ソリューション・ファイルである「WebImageSearch.sln」をダブルクリックしVisual Studio .NET(以下、VS.NET)を起動します。以下のような画面のVS.NETが立ち上がるはずです。

VS.NETでWebImageSearch.slnを開いたところ(C#版)
ソリューションには、アプリケーション本体用のプロジェクトであるWebImageSearchプロジェクトと、インターフェイスを定義したWebImageLibプロジェクトが含まれている。

 連載第1回目ではアプリケーション本体用のプロジェクトを作成し、WebImageLibプロジェクトを追加しました。WebImageLibプロジェクトは、共通となるインターフェイスを定義しているモジュールです。

■Google用プラグイン・プロジェクトの追加

 ここでは次に、Google用プラグインの実装を含んでいるWISGoogleプロジェクトをこのソリューションに追加していきます。

 第1回目で解説しているように、WISGoogleプロジェクトを単体でビルドするとWISGoogle.dllが出来上がります。最終的にはこれをアプリケーション本体の実行ファイルと同じフォルダに置いておけば、アプリケーションの起動時に動的にロードして利用するようにする予定です。しかしこのようなプラグインとしての仕組みは次回で解説するとして、今回は単純化のためにWISGoogle.dllを静的にリンクして、Google専用のアプリケーションをまず作成していきます。

 このため、ソリューション・エクスプローラで[ソリューション'WebImageSearch'(2プロジェクト)]部分を右クリックし、[追加]−[既存のプロジェクト]で、WISGoogleフォルダのプロジェクト(WISGoogle.csproj)をソリューションに追加します。

ソリューションへのWISGoogleプロジェクトの追加
ソリューション・エクスプローラで[ソリューション'WebImageSearch'(2プロジェクト)]部分を右クリックし、[追加]−[既存のプロジェクト]を実行して、WISGoogleフォルダのプロジェクト(WISGoogle.csproj)をソリューションに追加する。

■2つのプロジェクトへの参照の追加

 さらに、アプリケーション本体のビルド時にWebImageLibプロジェクトとWISGoogleプロジェクトが自動的に参照されるように、WebImageSearchプロジェクトからこれら2つのプロジェクトへの参照を追加します。

 これには、まずソリューション・エクスプローラで[WebImageSearch]部分を右クリックして[参照の追加]を実行し、以下の[参照の追加]ダイアログを開きます。

プロジェクトの参照の追加
ソリューション・エクスプローラで[WebImageSearch]部分を右クリックして[参照の追加]を実行し、このダイアログを開く。ここでは[プロジェクト]タブを開き、WebImageLibプロジェクトとWISGoogleプロジェクトを選択する。

 この[参照の追加]ダイアログでは、[プロジェクト]タブを開き、WebImageLibプロジェクトとWISGoogleプロジェクトの両方を選択して[OK]ボタンを押します。これでWebImageSearchプロジェクトは、ほかの2つのプロジェクトを参照するようになります。

 ここでいったんソリューションのビルドを行ってください。これによりWebImageSearchフォルダには「bin\Debugディレクトリ」が作成されて、そこにはWebImageSearch.exe、WebImageLib.dll、WISGoogle.dllの3つが作成されているはずです。

■Google用プラグインのテスト

 ここで、アプリケーション本体からGoogle用プラグインが正しく使用できるかをテストしておきましょう。

 まずWebImageSearchプロジェクトに含まれるForm.csのコードを開き、その冒頭部分に次の2行を追加します。

using WebImageLib;
using WISGoogle;
Imports WebImageLib
Imports WISGoogle
コンポーネントの名前空間の参照(上:C#、下:VB.NET)
「WebImageLib」はWebImageLibプロジェクトに含まれるクラスやインターフェイスの名前空間。「WISGoogle」はWISGoogleプロジェクトに含まれるクラスの名前空間。

 次にデザイン画面でフォームをダブルクリックし、以下のようなテスト・コードを書き込みます。

private void Form1_Load(object sender, System.EventArgs e)
{
  IWebImage google = new GoogleImage();
  foreach (WebImage wi in google.GetImages("c#"))
  {
    Console.WriteLine(wi.SmallImageURL);
  }
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim google As IWebImage = New GoogleImage()
  For Each wi As WebImage In google.GetImages("c#")
    Console.WriteLine(wi.SmallImageURL)
  Next
End Sub
プロジェクトの設定をテストするためのコード(上:C#、下:VB.NET)
GoogleImageクラスを使用するこれらのコードの詳細については連載第1回目で解説している。

 実行してVS.NETの[出力]ウィンドウにサムネイル画像のURLが表示されればOKです。

上記コードの実行例
VS.NETの[出力]ウィンドウにGoogleにあるサムネイル画像のURLが表示される。
 

 INDEX
  .NETでWindowsアプリを作ろう
  第3回 画像検索ツール本体をマルチスレッドで作ろう
  1.Google用プラグイン・プロジェクトの追加とテスト
    2.サムネイル画像コントロールの登録とテスト
    3.アプリケーションの画面設計とコーディング
    4.マルチスレッドによる検索処理
 
インデックス・ページヘ  「.NETでWindowsアプリを作ろう 」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間