サンプルコードをもとに、トレースデータ読込み・リアルタイム表示・フィルタ表示について解説します。
ViewRttは、以下2つのトレースデータ分析アプリケーション(.net/CLRアプリケーション)用アセンブリを使用しています。
アセンブリ名 |
名前空間 |
クラス |
説明 |
librttw.dll |
librttw |
librttw |
トレースデータファイルの読み込み、トレースデータの抽出を行います。 |
RttRecord |
トレースデータ1件分を保持します |
rttparser.dll |
rttparser |
RttParser |
トレースデータ内から取得したバイナリレコードを、条件に沿ったデータレコードとして返却します。 |
RttFilter |
あらかじめ設定した条件で取得したレコードを評価します。 |
①トレースデータ読込み処理
機能説明
トレースデータはトレースデータファイル(*.rtt)を直接ダブルクリックするか、ViewRtt画面上部にある[File]をクリックしトレースデータファイル(*.rtt)を選択することで、読み込むことが出来ます。
サンプルコード解説
サンプルコード[MainWindow.xaml.cs]のLoadFile()関数(625行目)でトレースデータを読み込んでいます。
LoadFile()関数内では下記3ステップでにより、トレースデータを読み込みリスト表示します。
・ステップ1: トレースデータファイルオープン
・ステップ2: スキーマ定義読込み/フィルター設定初期化
・ステップ3: トレースデータ全読込み/リスト表示
[ステップ1:トレースデータファイルオープン]
サンプルコード[MainWindow.xaml.cs]のAttachMMF()関数(224行目)で、指定されたトレースデータファイルをRttLibクラス:Open()によってオープンします。
[ステップ2:スキーマ定義読込み/フィルター設定初期化]
サンプルコード[MainWindow.xaml.cs]のAttachParser()関数(268行目)で、スキーマ定義の読込みとフィルターオブジェクトの生成・初期化を行います。
[ステップ3:トレースデータ全読込み/リスト表示]
サンプルコード[MainWindow.xaml.cs]のReadAll()タスク(346行目)で、トレースデータファイル内のデータを全て読み込みます。
1件のトレースデータを取得するNext()関数(309行目)を繰り返し呼び出し、ファイルデータがすべて読み込まれるまで繰り返します。
読み込んだ1件のトレースデータを、AddList()関数(297行目)にてリストボックスに追加します。
RecShowListは、画面上のListViewオブジェクトとバインディングされており、Addメソッドにて1件のトレースデータをリストに追加することが出来ます。
以上で、トレースデータ読込処理は完了です。
②リアルタイム表示処理
機能説明
ViewRtt画面上部にある[Live]をクリックすることで、収集中のトレースデータを即座に表示させるリアルタイム表示が可能です。
サンプルコード解説
[Live]クリックイベントが発生すると、サンプルコード[MainWindow.xaml.cs]の StartLive()関数(561行目)が
呼ばれます。
StartLive()関数では、まずAttachLIVE()関数(250行目)が呼ばれ、RttLibクラス:LiveOpne()によってリアルタイム表示でのトレースデータオープン処理(ライブストリーム接続)が行われます。
ライブストリーム接続完了後、ライブストリーム受信スレッドLiveThread()(156行目)を生成します。
ライブストリーム受信スレッドは、リアルタイム表示モードが解除されるまでトレースデータ取得・表示処理を繰り返します。
データ取得は[①トレースデータ読込み処理]と同じで、 Next()関数(309行目)が呼ばれますが、オープン処理がRttLibクラス:LiveOpne()であるため、現在収集中のトレースデータを取得することが出来ます。
③フィルター表示処理
機能説明
ViewRtt画面上部にある[Filter]テキストボックスにフィルター条件を記述し[Apply]ボタンをクリックすることで、条件にマッチするデータのみを表示することが可能です。
サンプルコード解説
[Apply] クリックイベントが発生すると、サンプルコード[MainWindow.xaml.cs]の SetFilter()関数(462行目)が呼ばれます。
ここでは、 [Filter]テキストボックスに記述されたフィルタ条件を、RttFilterクラスのフィルターオブジェクトに対してセットしています。
フィルタ条件のセットが完了すると、現在リスト表示しているデータを全て削除し再描画処理が行われます。
リアルタイム表示モードの場合LiveThread()(156行目)/トレースデータファイルをオープンしている場合ReadAll()関数(346行目)が呼ばれ、データ取得を行うNext()関数(309行目)内でフィルタ条件にマッチするかを判定しています。
フィルタ条件にマッチしないデータの場合、そのレコードのタイムスタンプ情報にuint.MaxValuを格納し、除外する為のマークを付けます。
その後、リストに追加する前にタイムスタンプ情報を確認し、それがuint.MaxValueであった場合フィルタされるべきレコードとして、表示処理をスキップします。