Lua から Python:PIPE 1本で双方向+EVENT

2017-02-06 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-02-05)の記事「Lua/Python:PIPE 1本で双方向+EVENT」では、方式の変更が必要になった。


それで、
再設計を行った。


クライアント側コード:
------------- Master_1_Py.gsl
require'cdef_PIPE_Event_SUB'
print( 'Start' ) -- デバッグ用
-- パイプを作成
P1 = C.CreateNamedPipeA( charA("\\\\.\\pipe\\PIPE1"), 3, 0, 1, 0, 0, 100, 0 )
-- サーバー立ち上げ
os.execute('start Py_Slave_1.py')
-- PIPE オープン待ち
rtn=C.ConnectNamedPipe( P1, 0 )

-- イベントオブジェクト取得
E1 = C.OpenEventA( 0x001F0003, 0, charA('EVENT1') )
-- 立ち上げ確認:シグナル状態チェック for Start
repeat until band( C.WaitForSingleObject( E1, 1 ), 2 ) == 0 -- on 迄

----- シグナル off に:初期化
C.ResetEvent( E1 )
------------------------------------ 主処理:
while true do
print( 'Input: e for END' )
str = io.read() -- キー入力

-- シグナル off にして、リクエスト送信
C.ResetEvent( E1 )
rtn = C.WriteFile( P1, charA(str), #str, nIO, 0 ) ---------------------┐
if str == 'e' then break end

C.Sleep(100) ----- ダミー処理時間

-- シグナル状態チェック -- on 迄
repeat until band( C.WaitForSingleObject( E1, 1 ), 2 ) == 0
----- 結果受信
rtn=C.ReadFile( P1, charA(Buf), 4097, nIO, 0 ) ---------------------┘
str=ffi.string(Buf,nIO[0])
print( nIO[0], str )
end
C.FlushFileBuffers( P1 )
C.DisconnectNamedPipe( P1 )
C.CloseHandle( P1 )
print( 'End' ) -- デバッグ用
_=io.read(1)
ここで、
サブプログラム“cdef_PIPE_Event_SUB.lua”は、
クライアント/サーバ:PIPE 1本で双方向+EVENT」で定義したもの。

サーバ側コード:
# coding: utf-8
# ------------- Py_Slave_1.py
import win32pipe, win32file
import win32event
import time
print( 'Start Slave' ) # ----- デバッグ用

#----- マスタ(クライアント)から呼ばれ:
# イベントハンドルを非シグナルで作成。
E1 = win32event.CreateEvent( None, 1, 0, 'EVENT1' )
# シグナル状態にする。
win32event.SetEvent( E1 )

#-- PIPE オープン
P1 = win32file.CreateFile("\\\\.\\pipe\\PIPE1",
win32file.GENERIC_READ | win32file.GENERIC_WRITE,
0, None, win32file.OPEN_EXISTING, 0, None);

# ------------------------------------ 処理:無限ループ:
while True:
# -- シグナル状態チェック -- off 迄
flg = win32event.WaitForSingleObject( E1, 0 )
while flg == 0: # -- シグナル on==0、off==258(初期状態)
flg = win32event.WaitForSingleObject( E1, 0 )
# -- リクエスト受信
data = win32file.ReadFile( P1, 4096 );
print data[1];
if data[1]=='e':
break;

time.sleep( 1 ) # ダミー時間待ち(秒数)
data = data[1] + "HOGE";

# -- シグナル on にして、結果送信
win32event.SetEvent( E1 )
win32file.WriteFile( P1, data );

print( 'End Slave' ) # ----- デバッグ用
_=raw_input()

以上で、
“Master_1_Py.gsl”をダブルクリックで、・・・

OKですね。


本日はここまで。


“クライアント/サーバ”学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170113
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク