Windowsプログラムはメモリにロードされ,動作を開始すると「Windowsプロセス」と呼ばれます。私たちのマシン内で動作している各Windowsプロセスは実行優先度というものが割り当てられ,実行順位が決められています。今回は,比較的高度な実行優先順位を持つWindowsプロセスを探し出し,Excelシート上に表示してみることにします。SP1とSP2環境ではどのような違いがあるのでしょう。さっそく,調べてみましょう。

図1●サンプル・プログラムの実行結果

今回のサンプル・プログラム

 まずはいつものように,サンプル・プログラムをこちらからからダウンロードし,実行してみましょう。技術的な説明は後ほど行います。筆者の「Windows XP SP2+Excel 2003」環境で実行すると,図1[拡大表示]のような結果が返されました。

 図1の中で特に注目してほしいのは,「Sub Total Count」欄の数値です。この数値は,高度な実行優先度を持つプロセスの数なのですが,意外と少ないことが分かります。皆さんの環境ではどのような数値が返されていることでしょう。お時間のあるときにぜひ自分の環境で実行してみてください。

 Windowsプロセスそのものについては,筆者が以前に公開したこちらの記事を参考にしてください。マシンの状態がどうもおかしい,あるいは,アプリケーションの動作が重たいなどと感じられた場合には,高度な実行優先度を持つプロセスを列挙し,使用しているメモリー量,内部で発生しているページ・フォールト回数,起動中のスレッド数などを調べると,何らかのヒントが得られることもあります。

 そのためには,常日ごろから,今回のようなサンプル・プログラムを動かし,Windowsプロセスそのものに慣れておくとよいと思います。表示情報の絞り込み条件を複数設定し,問題を特定していく訓練を積んでおくとよいでしょう。絞り込み条件を自由に設定できるようになると,プログラミング自体が断然楽しくなります。そうなれば,しめたものです。ぜひ頑張りましょう!

サンプル・プログラムの技術背景

 今回のサンプル・プログラム内では次のような絞り込み条件を設定しています。

If oObject_2.Priority > 8 Then

 プログラミング経験をそれほど持たない人でも,このソースコードの意味をなんとか理解できるのではないかと思います。この条件は,「優先度が8以上の場合」という意味を持っています。8という優先度を条件内に記述した理由は,この優先度を持つプロセスがかなり存在するからなのです。次のような条件を設定すれば,優先度8を持つプロセスを簡単に列挙することができます。

If oObject_2.Priority = 8 Then

図2●優先度8を持つプロセスの数
図3●SVCHOST.EXEプロセスに関する情報
 簡単ですね。筆者の環境では図2[拡大表示]のような結果が返されました。ご覧のように,プロセス総数31のうち25個は,実行優先度8を持っています。皆さんの環境ではどうなっているでしょう。この画面を下方向にスクロールしていくと,ベテラン開発者の間で時折話題になる,SVCHOST.EXEというプロセスがあります。次のような条件を設定すると,SVCHOST.EXEプロセスに関する情報だけが返されるはずです。

If ucase(oObject_2.Name) = ucase("SVCHOST.EXE") Then

 参考のために筆者の環境の実行結果を紹介しておきます(図3[拡大表示])。SVCHOST.EXEという同名のプロセスが7個も同時に動いています。考えれば考えるほど不思議ですね。SVCHOST.EXEプロセルそのものついては,次回以降の連載で取り上げる予定です。今回は確認だけにとどめておきます。

 それでは最後に,Excelへの情報表示を担当しているコード部分を説明しておきます。筆者はExcel初心者であることもあり,次の6個のオブジェクトの使い方を理解するように努めています。

  • Applicationオブジェクト
  • Workbooksオブジェクト
  • Workbookオブジェクト
  • Worksheetsオブジェクト
  • Worksheetオブジェクト
  • Cellsオブジェクト

 この6個のオブジェクトに加え,最近では,Rangeオブジェクトの意味を何とか自分なりに理解したいと考えているため,米Microsoftが公開するこちらの記事を読んでみました。この記事は,読者層としてはシステム管理者を想定しているようなのですが,Rangeオブジェクトのコーディングを次のように説明しています。

Set objRange2 = objExcel.Range("A1")

 筆者はこのコードを最初に見たとき,「A1ってなに?」という状態に陥り,かなり混乱してしまいました。この記事の起草者はそれまでの説明では,次のようなコードを使っていたのです。

objExcel.Cells(i,1).Value = i

 Range("A1")とCells(1,1)は同じ意味のはずです。しかし筆者が混乱したのはその説明の方法です。Range("A1")とCells(1,1)の2つの関係とその意味的なつながりがまったく説明されていないのです。RangeオブジェクトのRangeは日本語に翻訳すれば,「範囲」ということです。Excel初心者である筆者の解釈では「Rangeとは,複数のセルで構成される範囲」です。これはきわめて自然な解釈のはずです。この解釈に従って,筆者はサンプル・プログラム内で次のようなコードを記述しています。

oTemp.Range(oTemp.Cells(1,1),oTemp.Cells(i-1,10))

 このソースコードは,Cells(1,1)からCells(i-1,10)までの範囲をRangeオブジェクトして定義しています。筆者はこのソースコードを見つけ出すまでかなりの時間を要しました(Excelオブジェクトライブラリを時間をかけて学習しました)。それは常識でしょう,といわれれば,それまでなのですが,初心者に必要なのは,飛躍のない分かりやすい説明です。

 この記事の公開日付を確認してみると,2004年5月17日となっています。これは筆者の推測にすぎませんが,もしかすると,VBScriptなどのスクリプト言語からExcel機能を再利用するのはそれほど一般的なことではないのかもしれません。本連載では,「こうすればうまくいきます」ではなく,「なぜそうなのか」という点にこだわってみたいと思います。

 今回のサンプル・プログラムは,前回と同じように,New31WithExcelクラスのShowProcessesメソッドとして実装しています。これまで多数のメソッドを追加してきていますから,プログラムの見通しを改善するために,mainというルーチンをプログラムの先頭に追加してみました。そのルーチンを確認すると分かりますが,プログラムの構造自体はシンプルになっています。mainルーチンを見ただけで,プログラミング経験のない人でも,サンプル・プログラムの機能を把握できるはずです。プログラミングに興味のある方は,ソースコード内のクラス実装部を検討し,自由に変更してみてください。

 筆者はRangeオブジェクトの意味を自分なりに理解しましたから,次回からは,収集したデータを「Excelでどのように表現するか」という,外観デザインにも多少注意してみたいと思います。初めてExcelプログラミングに挑戦する方は,ぜひお付き合いください。

今回のまとめ

  • Windowsプロセスは実行優先度を持っている
  • Windowsプロセスの実行優先度は簡単に調査できる
  • 高度な実行優先度を持つWindowsプロセスは意外と少ない
  • 真に必要な情報を探す作業は時間がかかる

 今回は以上で終了です。次回またお会いいたしましょう。ごきげんよう!