■
出力結果と取り扱いについて
この頁では、判定結果を共有メモリを通じて取り込む方法を VC/MFC製サンプルプログラムとともに紹介します。
サンプルソフト1(エクセル製)と重複する説明も多いかと思います。
CSV ファイルを通じたやりとりはじゃまくさいだけなので、こちらの機能には入れていません。
出力内容、レイアウト等についてはサンプルソフト1の頁を参照ください。
●
サンプルプログラムのDL
次のところからダウンロードできます。サンプルexe とともに cpp/h ファイルを同梱していますので、このソースを見た方がわかりやすいかもしれません。
今なんぼ結果モニタ・VC 製(NanboMntVc.zip) Ver1.00 June.17,2011 のダウンロード
当方が動作確認に使用している数列表示実行ソフトも公開しておきます。ユーザープログラムの動作確認等にお使いください。
フォント指定数列表示ソフト(NoTest.zip) Ver1.10 April.12,2011 のダウンロード(参考用)
●
exe の使い方
モニタ例
過去3回のモニタ記録が出る
[ 手順 ]
- モニタ対象画面を表示する。(IEでもテスト用の NoTest.exe でも可)
- 「今なんぼ」を立ち上げる。
- モニタ条件として共有メモリ出力を選択する。
- モニタゾーン指定後、モニタ指示し、モニタモードに入る。
- 結果モニタ(MemRMnt.exe) を立ち上げる。
「共有メモリアクセス可」の表示を確認。(OKならデータあり)
モニタ開始ボタンをクリックして、1秒ごとにカウントアップすることを確認。
これで上例のように自動的にデータが出てくる。
- [ 表示データ ]
- 最新記録
- 前回記録(最初は空行,CR+LFのみ)
- 前々回記録(2回目まで空行,CR+LFのみ)
通常は先頭レコードだけ取り出せば十分でしょうが、変化を知りたいときは、前回記録などとの差を取り出して利用ください。
●
共有メモリアクセス方法
- タイマ処理で、一定インタバルにて、共有メモリに読出しモードでアクセスして、先頭の最新処理時刻が前と異なっていると、単純に読出し処理します。
- 共有メモリは Windows APIを使用してアクセスします。
固定名を指定すればアクセスできます
- データはアスキー形式の3レコードCSV イメージです。(カンマ区切り、CR+LF が行区切り)
- 全部で3レコードで、せいぜい120バイトどまりです。
[ 変数の定義 ]
- // 共有メモリ
- HANDLE m_hFileMap; // ハンドル
- LPSTR m_pMapView; // アドレス
[ 共有メモリのアドレス取得関数 ]
- //====================================================================
- // 共有メモリのアクセス可否チェックをする
- //====================================================================
- BOOL CMemRMntDlg::MapViewChk()
- {
- m_pMapView=0; // デフォルトはアドレス取得失敗=共有メモリアクセス不可
- // ファイルマッピングオブジェクトを開く
- m_hFileMap = ::OpenFileMapping(
- FILE_MAP_READ, // アクセスモード 読出し専用
- FALSE, // 継承フラグ
- _T("Nanbo_shared_memory")); // オブジェクト名 固有名
- if(!m_hFileMap) return FALSE;
- //------------------------------------------------------
- // 共有ファイルのポインタ(=アドレス)を取得する
- m_pMapView = (LPSTR)::MapViewOfFile(
- m_hFileMap, // ハンドル
- FILE_MAP_READ, // モード 読出し専用
- 0, // オフセット上位=0
- 0, // オフセット下位=0
- 0); // マップ対象バイト数、0で全部
- if(m_pMapView==0) return FALSE;
return TRUE;
- }
[ 共有メモリのデータ読出し関数 ]
- char str[256];
- int NB,NB2;
- if(m_pMapView==0)
- {
- m_strMonitRsltNewest="";
- m_strMonitRsltPre="";
- m_strMonitRsltPre2="";
- }
- else
- {
- // 最新記録
- NB=LineGet(&m_pMapView[0],str,sizeof(str));
- m_strMonitRsltNewest=CString(str);
- NB+=2; // CR+LF のバイト数補正
- // 1回前記録
- NB2=LineGet(&m_pMapView[NB],str,sizeof(str));
- m_strMonitRsltPre=CString(str);
- // 2回前記録
- NB2+=2;
- LineGet(&m_pMapView[NB+NB2],str,sizeof(str));
- m_strMonitRsltPre2=CString(str);
- }
- UpdateData(FALSE);
- ==== 中略 ====
- //==========================================================================
- // 1行文字列取得( *pAdr → *pStrGet から取得、NStrGet は格納可能バイト数 )
- //==========================================================================
- int CMemRMntDlg::LineGet(char *pAdr,char *pStrGet,int NStrGet)
- {
- int N=0; // 文字数カウンタ
- char c;
- while(1)
- {
- switch(c=*pAdr++)
- {
- case 0x0d:
- *pStrGet=0x00;
- return N; // CR+LF の前までのバイト数
- default:
- *pStrGet++=c;
- if(++N>=NStrGet)
- {
- *pStrGet=0x00;
- return N;
- }
- break;
- }
- }
- }
実際の処理はサンプルプログラムのソースを参照ください。
●
NoTest.exe(フォント指定数列表示ソフト)の使用法
ユーザーが結果利用ソフトを作った場合、デバッグが大変だろうと、数字列をタイマ仕掛けで表示するソフトをDLして使用できます。
数字範囲、フォント指定で、「カウント開始」ボタンクリックで数字列を指定インタバルで表示します。
この数列を「今なんぼ」で(必要なら一部を)囲んで、モニタを開始してください。