クライアント/サーバ:イベント学習
2017-01-29 : 
PCクリニック
以前(2017-01-23)の記事「クライアント/サーバ:プロセス間通信」では、・・・・・
・・・・・
それには、
イベントオブジェクト の学習が必要ですね。
・・・・・
・・・・・
で終わっていた。
その後、
双方向パイプ1本で送受信を行いたくて、
イベントに関する記事を検索した。
検索の結果、
学習教材としたのは;
“プログラミング入門サイト ~bituse~”の
“WINAPI入門ページ”の中の1つ:
「プロセス・スレッド間の同期(イベント)」
今回はプロセス・スレッド間の同期(イベント)について説明します。
過去二回は排他制御についてやってきましたが、
今回はプロセス・スレッド間で行う同期処理の仕組みを説明します。
イベントという仕組みを使って同期処理を行うのですが、
何かのイベントが発生したときに、シグナル・非シグナル状態を切り替える、
というだけの単純な仕組みです。
排他制御ではありませんので、同時に実行されてしまいます。
何かの動作をした時にシグナル・非シグナルを切り換える、
というだけの単純なものです。
ただそれを、スレッドはもちろん、プロセス間でも共有できる
というのが大きいですね。
・・・・・
・・・・・
と云うことで、学習した。
ポイントは:
1.CreateEvent関数を使って、イベントオブジェクトを作成
2.OpenEvent関数を使って、イベントオブジェクトハンドルを取得
3.SetEvent関数、ResetEvent関数を使って、シグナルを on/off
ですね。
でも、“CreateEvent”は“CreateEventA”だった。
それから、WaitForSingleObject関数も欲しい。これについては、MSDN(英文)を参照
要約(プロトタイプ宣言形式):
ffi.cdef[[ですね。
// CreateEvent関数:イベントオブジェクト作成
HANDLE CreateEventA(
LPSECURITY_ATTRIBUTES lpEventAttributes, // セキュリティ記述子
BOOL bManualReset, // リセットのタイプ
BOOL bInitialState, // 初期状態
LPCTSTR lpName // イベントオブジェクトの名前
);
// 第一引数:NULLを指定するとデフォルト値
// 第二引数:非シグナル状態に戻す時は、手動で(TRUE)、自動で(FALSE)を指定
// 第三引数:初期シグナル状態指定:TRUEでシグナル状態、FALSEで非シグナル状態
// 第四引数:イベントオブジェクトの名前を指定
// 成功すると、イベントオブジェクトのハンドルが返ります。
// OpenEvent関数:イベントオブジェクトのハンドル取得
HANDLE OpenEventA(
DWORD dwDesiredAccess, // アクセス権
BOOL bInheritHandle, // 継承オプション
LPCTSTR lpName // イベントオブジェクトの名前
);
// 普通に使うには、
// 第一引数にEVENT_ALL_ACCESS、
// 第二引数にFALSE、
// 成功すると、イベントオブジェクトのハンドルが返ります。
// SetEvent関数:イベントをシグナル状態にする
BOOL SetEvent( HANDLE hEvent ); // イベントオブジェクトのハンドル
// ResetEvent関数:非シグナル状態にする
BOOL ResetEvent( HANDLE hEvent ); // イベントオブジェクトのハンドル
// WaitForSingleObject関数:
DWORD WaitForSingleObject(
HANDLE hHandle, // オブジェクトのハンドル
DWORD dwMilliseconds // タイムアウト時間:ミリ秒(ms)単位で指定
);
// タイムアウト時間が経過すると、非シグナル状態であっても、制御を返す。
// 0 を指定すると、指定されたオブジェクトの状態を調べ、即座に制御を返す。
// INFINITE を指定すると、シグナル状態になるまで待機し続ける。
// 関数が成功すると、
// WAIT_ABANDONED:オブジェクトは、放棄された
// WAIT_OBJECT_0 :オブジェクトがシグナル状態になった
// WAIT_TIMEOUT :タイムアウト時間が経過。非シグナル状態であった
// 関数が失敗すると、WAIT_FAILED が返る。
]]
そこで、
プログラムを2本作って、動作確認しようとしたが、
“EVENT_ALL_ACCESS”の値が・・・・・分からない?
もっと学習が必要だ。
本日はここまで。
“クライアント/サーバ”学習は続く。
見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒


170109
- 関連記事
-
- Lua/Python:PIPE 1本で双方向+EVENT (2017/02/05)
- クライアント/サーバ:PIPE 1本で双方向+EVENT (2017/02/03)
- クライアント/サーバ:PIPE 1本で双方向通信 (2017/02/01)
- Win32 APIの定数:定義は? (2017/01/30)
- クライアント/サーバ:イベント学習 (2017/01/29)
- クライアント/サーバ:Lua - Python プロセス間通信 (2017/01/27)
- クライアント/サーバ:プロセス間通信・改 (2017/01/25)
- クライアント/サーバ:プロセス間通信 (2017/01/23)
- GSL Shell & Rclient 学習 (2017/01/22)
スポンサーサイト