.NET TIPS
ほかのアプリケーションを起動して入力可能になるまで待つには?[C#、VB]
デジタルアドバンテージ 遠藤 孝信
2009/02/05
「TIPS:ほかのアプリケーションを実行するには? 」では、外部アプリケーションの起動方法を解説したが、起動に続けて、そのアプリケーションを操作したいような場合には、それが実際に利用できるようになるまで待つ必要がある。たいていのアプリケーションは、実行ファイルが起動されてから、それが実際に利用できるようになるまでに初期化などで時間がかかるためだ。
どれくらい待つ必要があるかは当然ながらアプリケーションによって異なるが、Processクラス(System.Diagnostics名前空間)には、プロセスがユーザー入力(マウスやキーボードの操作など)を受け付けることができるアイドル状態* になるまで待機するためのWaitForInputIdleメソッドが用意されている。
* より正確には、Windowsアプリケーションが持つメッセージ・ループがメッセージ待ちとなっている状態。
WaitForInputIdleメソッドはインスタンス・メソッドであるため、これを呼び出すには、まずProcessクラスのインスタンスを作成し、そのStartメソッドによりアプリケーションを実行している必要がある(既存のプロセスに対して呼び出す場合は、Process.GetProcessesメソッドなどにより、そのProcessオブジェクトを取得する)。
次のコードはWaitForInputIdleメソッドを使った簡易なベンチマーク用プログラムで、アプリケーションの起動時間を計測するためのものだ。これは、外部アプリケーションを起動し、その起動が完了するまでWaitForInputIdleメソッドを使って待機し、すぐにCloseMainWindowメソッドでウィンドウを閉じるという動作を何回か繰り返す。
// startbench.cs
using System;
using System.Diagnostics;
class Program {
static void Main(string[] args) {
string app = args[0]; // 起動する実行ファイルのパス
int num = 10; // 繰り返し回数
Stopwatch sw = new Stopwatch();
sw.Start(); // 時間計測開始
for (int i = 0; i < num; i++) {
Console.Write(".");
Process p = new Process();
p.StartInfo.FileName = app;
// p.StartInfo.Arguments = "……" // 起動オプションがある場合
p.Start(); // 起動
p.WaitForInputIdle(); // 起動完了待ち
p.CloseMainWindow(); // ウィンドウを閉じる
}
sw.Stop(); // 時間計測終了
Console.WriteLine();
Console.WriteLine("起動回数:" + num);
Console.WriteLine("合計時間:" + sw.Elapsed);
Console.WriteLine(
"平均時間:" + sw.ElapsedMilliseconds / num + "ミリ秒");
}
}
// コンパイル方法:csc startbench.cs
// 実行例:startbench.exe c:\WINDOWS\NOTEPAD.EXE
アプリケーションの起動時間を測定するC#のサンプル・プログラム(startbench.cs)
' startbench.vb
Imports System
Imports System.Diagnostics
Class Program
Shared Sub Main(ByVal args As String())
Dim app As String = args(0) ' 起動する実行ファイルのパス
Dim num As Integer = 10 ' 繰り返し回数
Dim sw As New Stopwatch()
sw.Start() ' 時間計測開始
For i As Integer = 1 To 10
Console.Write(".")
Dim p As New Process()
p.StartInfo.FileName = app
' p.StartInfo.Arguments = "……" ' 起動オプションがある場合
p.Start() ' 起動
p.WaitForInputIdle() ' 起動完了待ち
p.CloseMainWindow() ' ウィンドウを閉じる
Next
sw.Stop() ' 時間計測終了
Console.WriteLine()
Console.WriteLine("起動回数:" & num)
Console.WriteLine("合計時間:" & sw.Elapsed.ToString())
Console.WriteLine( _
"平均時間:" & sw.ElapsedMilliseconds / num & "ミリ秒")
End Sub
End Class
' コンパイル方法:vbc startbench.vb
' 実行例:startbench.exe c:\WINDOWS\NOTEPAD.EXE
アプリケーションの起動時間を測定するVBのサンプル・プログラム(startbench.vb)
次の画面はこのサンプル・プログラムの実行結果例だ。例としてVisual Studio 2008の起動時間を測定している。
サンプル・プログラムの実行結果例
なお、アプリケーションの作りやプロセス構造によっては、WaitForInputIdleメソッドの呼び出しがアプリケーション起動完了前に終了したり、呼び出しがいつまでも終了しなかったりする場合もあるため注意が必要だ。後者の場合には、最長待機時間を引数で指定できるWaitForInputIdleメソッド が利用できる。
カテゴリ: クラス・ライブラリ 処理対象: Windows環境
使用ライブラリ: Processクラス(System.Diagnostics名前空間)
関連TIPS: ほかのアプリケーションを実行するには?
generated by
TechTargetジャパン
キャリアアップ
**先週の人気講座ランキング**
〜 Android編 〜