DMMTool(仮名) for Windows開発状況その2


今回もまた、プログラミングに関する記事です。大変申し訳ございません。

前回のエントリを書いてから、空き時間を見つけては地道に作業を続けておりました。

前回からの改善点は

  • ネットワークアクセスから何から、ありとあらゆる物をマルチスレッド化した。
  • エラー処理の強化

徹底したマルチスレッド化

 前回のバージョンではURLボックスにURLを入力して情報取得ボタンを押すと、すべての情報の取得が完了するまでウィンドウがフリーズした状態になっていました。画像が多い場合、全情報の取得には10秒以上かかる場合もあり、その間ユーザーは何の操作もできずに待たねばならなかったのです。これはすべての処理をシングルスレッドで行っていたため、情報取得が完了するまでメインのGUIスレッドが止まるからです。

 ところが、たくさんある商品の情報を次々と取得したい場合、ある商品のURLを入力し、表示が完了するまで待ち、次の商品のURLを入力し、また待ち、なんてことはかったるくてやってられません。

 そこで、今回はHTMLのスクレイピングから画像の取得まで、すべてをスレッド化し、個別の情報が取得でき次第次々とイベントが発生するように改良しました。発生したイベントはメインのUIスレッドに伝えられ、その度に画面の更新が行われます。この状態でもメインのイベントループが動き続けているため、他の操作を行うことができます。

 おかげで、下の画像のようにたくさんのウィンドウを開いて次々と情報取得を行っても非常にぬるぬるとなめらかに動くようになりました。

dmmtool_overview.png

エラー処理の強化

 シングルスレッドで処理を行う場合、極端な話必要な処理を関数として書けるので、どこかでエラーが発生すればその時点で関数を抜けて処理を中断し、エラーが発生したことをユーザーに告知するだけのシンプルなプログラムで済みます。

 ところがマルチスレッドの場合には話がすこしややこしくなります。

 たとえば平行していくつものスレッドが動いている場合、あるスレッドは正常に完了したが、あるスレッドは途中でエラーが起きた、という状況が起きます。具体的には、複数の画像データをマルチスレッドで平行してダウンロードしていたがある画像のダウンロードだけは途中で失敗した、等のケースです。この場合、あるスレッドで発生したエラーをどのようにメインスレッドに伝えるかが問題となります。.NETではあるスレッドで発生した例外を他のスレッドでキャッチすることができないので、例外が発生した場合にはイベントを発生させてメインスレッドに例外を伝えるということをやっています。

 また、エラーの告知方法も少し工夫しました。

 このツールでは、ユーザーが商品情報の取得を開始して比較的早期に発生したエラー(URLの入力ミスやパッケージ画像が取得できなかった等)はダイアログを表示してその時点で処理が中断されます。

error1.png

 対して、すでに処理を開始してからある程度の時間が経過しており、もうそろそろ処理が終るだろうと思われる頃合いに発生したエラー(サンプル画像を取得中に発生したエラーなど)に関してはダイアログで告知せずにエラーが発生した事を示すアイコンのみを表示し、そのまま続行可能な処理を続けます。これには二つの理由があります。
  • ユーザーを完了まで待たせるだけ待たせておいてエラーで処理が中断されてはフラストレーションになるから。
  • 取得した画像全てがユーザーが必要としている画像となるケースは希であるから、リロードを行うかどうかはユーザーの判断に任せることにした。
error2.png
現時点で搭載している機能

 まだアフィリエイトリンクを作成する機能は実装されていませんが、以下の機能を搭載しています。
1.商品のタイトル、説明、出演者などの情報をテキストとして取得。
2.商品のパッケージ画像(大、小)を取得
feature1.png
3.商品のサンプル画像(大、小、ただしサンプル画像がある場合のみ)を取得
feature2.png今後搭載したい機能
  • お気に入り、履歴など
  • タブを用いて一枚のウィンドウで複数の商品情報を開けるようにしたい
  • 複数の商品のアフィリエイトリンクを効率よく作成できる手段の提供
なお、完成はまだまだ先になると思われますので、今すぐにでもDMMのアフィリエイトリンクを手軽に作成したい!という方は、当サイトで既に公開しておりますWebサービス版をご利用ください。