HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0530
cv2プロセスの使用24解決


cv

リンク

2010/5/30(Sun) 00:19:22|NO.32824

こんなことがしたいです。

[プロセスA] [プロセスB] C@A=0 C@B=C@A+1000 main(C@A)と main(C@B)と C@A++を1000回 C@B++を1000回 mainの戻り値が mainの戻り値が 一度でも偽なら 一度でも偽なら D@A=1 D@A=1 D@A=1でないなら 最初に戻る



この記事に返信する


ANTARES

リンク

2010/5/30(Sun) 01:39:52|NO.32825

 何がやりたいのかよくわかりませんが、
書いてある通りにコーディングしてみました。

#module #defcfunc main int p1 if init==0 { init=1 randomize } r=rnd($7fffffff) ret=r!=p1 if ret==0: title "p1="+p1+" r="+r ;デバッグ用 return ret #global repeat c@a=0 c@b=c@a+1000 gosub *procA gosub *procB if d@a==1: break await loop mes "c@a="+c@a+" c@b="+c@b+" d@a="+d@a stop *procA c=c@a repeat 1000 if main(c)==0: d@a=1: break c++ loop c@a+=1000 return *procB c=c@b repeat 1000 if main(c)==0: d@a=1: break c++ loop c@b+=1000 return



cv

リンク

2010/5/30(Sun) 12:10:57|NO.32832

えーと、@Aとか@BはプロセスA上のって意味なんですけど。。。



KA

リンク

2010/5/30(Sun) 12:40:37|NO.32833

>>えーと、@Aとか@BはプロセスA上のって意味なんですけど。。。
 ・・・・少しだけ意味が分かりました。

 実行ファイルを2つ起動すれば、手っ取り早い気がします。
 相互のやり取りは、工夫してください。
 質問のレベル的に、質問者は理解できると思います。



cv

リンク

2010/5/30(Sun) 14:46:52|NO.32839

>32832
日本語が間違っていました。
正しくは「@Aとか@BはプロセスAかプロセスB上のって意味」です。



nns

リンク

2010/5/30(Sun) 18:02:15|NO.32843

マルチスレッドの事をいっているのであれば、HSPでは不可能です
しかしKAさんが言っておられるように実行ファイルを二つ用意するのであれば
sendmsgとoncmdを使ったメッセージ処理もしくは
pipeputとpipegetを使ったパイプ処理を使うと実現出来るかもです



cv

リンク

2010/5/30(Sun) 19:57:31|NO.32847

>nnsさん
すいません。サンプルお願いします。



荒河

リンク

2010/5/30(Sun) 20:45:36|NO.32848

inovia氏のソフトにマルチタスクっぽいのありますよ

HSPThread.dll
http://homepage2.nifty.com/MJHS/filedownload/



inovia

リンク

2010/5/30(Sun) 21:30:26|NO.32851

なんか呼ばれた気がしたので(笑)

HSPThread.dll はAXファイルを別スレッドで動作させる関数とみなして実行するものです。
メインスレッド+サブスレッドの2つまで同時実行ができます。

とある大学の研究室で使用してくれた実績があります。


それと「マルチスレッドもどき」もありますね。
http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200707/07100036.txt



cv

リンク

2010/6/2(Wed) 21:57:59|NO.32929

えーと、変数の受け渡しはどうするのですか。



inovia

リンク

2010/6/2(Wed) 22:33:51|NO.32930

> えーと、変数の受け渡しはどうするのですか。

どれにレスしているのかよくわからないけど、HSPThreadのことでしたら、
ミューテックス(Mutex)やウィンドウメッセージなどを使って受け渡してください。

・ミューテックス
http://onishi-lab.jp/programming/thread_win.html
http://tokyo.cool.ne.jp/chokuto/advanced/singleton1.html
(内容がC言語だったり、2重起動防止のものですが考え方は同じです。)

・ウィンドウメッセージ
http://yokohama.cool.ne.jp/chokuto/urawaza/sendmsg.html



ANTARES

リンク

2010/6/3(Thu) 00:24:11|NO.32933

 マルチスレッドを使いたいということは見当がつきましたが、
マルチスレッドを使う必然性がないと言いたかったのです。
難しいと思うなら、マルチスレッドを使うこと自体を再検討しては?



retret

リンク

2010/6/3(Thu) 00:43:56|NO.32935

どこでどうマルチスレッドが出てきたんだよ。
質問者は「プロセス」だっつってんだろ。
プロセスはwindowsでは1つの実行ファイル単位なんだから、

「2つの実行ファイルを用意しろ」って教えてやれよ。
「2つの実行ファイルでの通信はプロセス間通信の手法を使え」って教えてやれよ。










あ?

「プロセス間通信」ってぐぐりゃいいだろ。そこまで親切じゃねーよ。



retret

リンク

2010/6/3(Thu) 00:45:08|NO.32936

どこでどうマルチスレッドが出てきたんだよ。
質問者は「プロセス」だっつってんだろ。
プロセスはwindowsでは1つの実行ファイル単位なんだから、

「2つの実行ファイルを用意しろ」って教えてやれよ。
「2つの実行ファイルでの通信はプロセス間通信の手法を使え」って教えてやれよ。










あ?

「プロセス間通信」ってぐぐりゃいいだろ。そこまで親切じゃねーよ。



retret

リンク

2010/6/3(Thu) 00:45:32|NO.32937

どこでどうマルチスレッドが出てきたんだよ。
質問者は「プロセス」だっつってんだろ。
プロセスはwindowsでは1つの実行ファイル単位なんだから、

「2つの実行ファイルを用意しろ」って教えてやれよ。
「2つの実行ファイルでの通信はプロセス間通信の手法を使え」って教えてやれよ。










あ?

「プロセス間通信」ってぐぐりゃいいだろ。そこまで親切じゃねーよ。



f3d

リンク

2010/6/3(Thu) 00:49:38|NO.32938

Q
>>どこでどうマルチスレッドが出てきたんだよ。
A
>>すいません。サンプルお願いします。

Q
>>「2つの実行ファイルを用意しろ」って教えてやれよ。
A
>>実行ファイルを2つ起動すれば、手っ取り早い気がします。


子供みたいな言葉遣いは止めましょうね。
姿は見えなくても幼いと分かってしまいますし、
聞かれてもいないことを答えたりするのも
子供のやることですよ。



テック

リンク

2010/6/3(Thu) 01:24:48|NO.32941

>「2つの実行ファイルを用意しろ」って教えてやれよ。
>「2つの実行ファイルでの通信はプロセス間通信の手法を使え」って教えてやれよ。
retretさん、少し落ち着きましょう。

>こんなことがしたいです。
cvさん、上記の1行とスクリプトが記述してあるだけでは、
こちらとしても何を調べていいのかわかりませんし、
推測で回答しないといけません。
質問は、日本語で詳しく具体的に記述してください。

>すいません。サンプルお願いします。
>えーと、変数の受け渡しはどうするのですか。
これは、いくらなんでも丸投げすぎます^^;
nnsさんが命令名を記述してくれているので、
HSP Document Libraryなどで調べられるので
なるべく自分で調べるようにしましょう。

ところで上記の皆様方のレスで
マルチプロセスとマルチスレッドが出てきていますが、
cvさんは違いを理解しておられますか?

・マルチプロセス
retretさんがおっしゃっているとおり、
プロセスとは、実行ファイル(exeファイル)を1回起動するごとに
1プロセス生成されます。
またプロセスでは、各プロセスごとにメモリは独立しています。
例えば以下のプロセスが有った場合、

[プロセスA]

g_nSample = 0 // サンプルグローバル変数 *Main  stop

[プロセスB]

g_nSample = 0 // サンプルグローバル変数 *Main  g_nSample = 1  stop

プロセスBでg_nSample変数の内容を変更しても
プロセスAのg_nSample変数の内容には影響しないということです。

・マルチスレッド
マルチスレッドというのは、
実行ファイル(exeファイル)を1回だけ起動し、
1プロセス内だけで複数の処理(スレッド)を生成し、
並行処理を行うことです。
またスレッドでは、メモリが共有されるということです。

例えば以下のプロセスが有った場合、
[プロセス]

g_nSample = 0 // サンプルグローバル変数 *Main  // CreateThread関数の引数は省略  hThreadA = CreateThread  hThreadB = CreateThread  stop

スレッドAでg_nSample変数の内容を変更しますと
スレッドBでg_nSample変数を使用していた場合は、
スレッドBにも影響するということです。

以上、私も推測で調べてみますが、
cvさんの具体的な質問を期待しています。
失礼します。



cv

リンク

2010/6/3(Thu) 17:12:57|NO.32955

えーと、使用したいのはマルチスレッドではありません。
ほしかったサンプルは
>実行ファイルを二つ用意するのであれば
>sendmsgとoncmdを使ったメッセージ処理もしくは
>pipeputとpipegetを使ったパイプ処理を使うと実現出来るかもです
これのサンプルです。



KA

リンク

2010/6/3(Thu) 23:50:44|NO.32965

>>main(C@A)
とか、書いていたのでCを知っていると思っていましたが・・・。

>>これのサンプルです。
安直に聞くよりも、まず探しましょう。
このスレを最初から見ていけば、ヒントは出ています。



cv

リンク

2010/6/4(Fri) 20:36:08|NO.32997

どうやったらpipeputとpipegetで向こう側から変数を受け取るのですか。



テック

リンク

2010/6/4(Fri) 21:27:12|NO.32999

>どうやったらpipeputとpipegetで向こう側から変数を受け取るのですか。
え〜とHSPをインストールしてあるのであれば、
ドキュメントブラウザ(HSP Document Library)も
インストールされている筈なのですが・・・。

私は最初、pipegetの説明(pipeget p1)にて
p1に渡した変数に結果が返ってくると思ってましたが違いました^^;
結論は、pipegetで処理が終了するまで監視をして
処理が終了したら
pipeexec命令(pipeexec p1,"filename",p2)の
p1に渡した変数に処理が返ってくるのですね。

以下にサンプルのpipe.hspのほぼパクリですが、
作成したスクリプトを載せておきます。


#include "hspext.as" g_nStatus = 0 g_strCmd = "ipconfig /all" sdim g_strResult1, 16384 sdim g_strResult2, 16384 // 指定した実行ファイルを実行する pipeexec g_strResult1, g_strCmd, 1 // 指定した実行ファイルを実行できなかった場合 if stat { dialog "実行できませんでした" end // 指定した実行ファイルを実行できた場合 } else { mes g_strCmd + "を実行中です・・・" } // 指定した実行ファイルが終了するまでループする do // 指定した実行ファイルの実行状況を監視する pipeget g_strResult2 // 戻り値を退避しておく g_nStatus = stat // 一時中断する wait 10 // 画面をクリアする cls // メッセージを表示する mes g_strCmd + "を実行中です・・・" // メッセージを表示する // mes g_nStatus until g_nStatus = 0 // メッセージを表示する mes g_strCmd + "が終了しました" // 標準出力を表示する mes g_strResult1 stop

※注意
cvさん、pipeexec命令ですが、
ドキュメントブラウザ(HSP Document Library)の解説に書いてあるように、

pipeexec命令は、おもにwin32コンソールアプリケーション
(DOSプロンプトで動作する32bitアプリケーション)
の実行を支援するための機能です。

上記のスクリプトでは、Windows標準コマンドの「ipconfig」を使用しましたが、
自分で作成したプログラムを実行したいのならば、
実行したいプログラムをC言語で作成しなければなりません。
またg_strCmd = "ipconfig /all"のipconfig /allを
自作のプログラムの実行ファイル名に置き換えなければなりません。
以上、C言語などについては、なるべく自分で調べてみましょう。
失礼します。



nns

リンク

2010/6/4(Fri) 21:53:50|NO.33001




窓口

リンク

2010/6/5(Sat) 02:09:26|NO.33004

FileMapping オブジェクトを利用して
変数を2つ以上のプロセスで共有するモジュールを作ってみました。


InitModule@FileMapping #module FileMapping m_objname , m_info #uselib "Kernel32.dll" #cfunc c_CreateFileMapping "CreateFileMappingA" int , int , int , int , int , sptr #cfunc c_GetLastError "GetLastError" #cfunc c_MapViewOfFile "MapViewOfFile" int , int, int, int, int #func f_UnmapViewOfFile "UnmapViewOfFile" int #func f_CloseHandle "CloseHandle" int #define INVALID_HANDLE_VALUE $FFFFFFFF #define PAGE_READWRITE $00000004 #define ERROR_ALREADY_EXISTS $000000B7 #define FILE_MAP_WRITE $00000002 // InitModule@FileMapping ;[引数無し] ;[戻り値無し] ;[説明] ; AllocSharedMemory を使用するための初期化 #deffunc local InitModule SharedMemoryKey = "Hsp_MyFileMapObjModule_" ; オブジェクト名の先頭に追加する文字列 dim TotalNumberOfObjectsCreatedEver ; 今までつくられた共有変数の総数である。 return // sharedkey str ; 1 鍵と成る文字列 ;[戻り値無し] ;[説明] ; 鍵と成る文字列を設定する #deffunc sharedkey str sotn_string_ SharedMemoryKey = sotn_string_ return // gdimtype var , int , int // gdim var , int // gsdim var , int // gddim var , int ; 1 共有変数と成るする変数名 ; 2 共有変数の配列数 ; 一次元配列までしか指定できない。 ; 3 vartype() 関数で返る定数の値を指定する。 ;[戻り値] ; エラーコード ;[使用例] // プロセス間共有変数を作成する ; sharedkey "sk_test" ; gdimtype sm_Flg , 1 , vartype( "int" ) ; int 型の共有変数を作成する。 ; gdimtype sm_Flg , 300 , vartype( "str" ) ; str 型の共有変数を作成する。 #deffunc gdimtype var asm_var_ , int asm_length_ , int asm_type_ objname = strf("%s[%01x%08x%08x]" , SharedMemoryKey , asm_type_ , asm_length_ , TotalNumberOfObjectsCreatedEver) TotalNumberOfObjectsCreatedEver++ newmod ModvarFileMap , FileMapping , asm_var_ , asm_length_ , asm_type_ , objname return stat #define global gdim(%1,%2)\ gdimtype %1,%2,vartype("int") #define global gsdim(%1,%2)\ gdimtype %1,%2,vartype("str") #define global gddim(%1,%2)\ gdimtype %1,%2,vartype( "double" ) // newmod modvar , FileMapping , svar , length , vartype() , objname ; 1 共有変数と成る変数名 ; 2 要素数 ; 3 タイプ ; 4 オブジェクトの名前 ;[戻り値] ; エラーコード ; 負数である限りエラーが発生している。 ;[説明] ; プロセス間共有変数を作成する。 #modinit var nm_var_ , int nm_size_ , int nm_type_ , str nm_objname_ dim m_info , 6 #define m_hMapObj m_info.0 #define m_lpData m_info.1 #define m_length m_info.2 #define m_type m_info.3 #define m_elesize m_info.4 #define m_bufsize m_info.5 m_objname = nm_objname_ m_length = nm_size_ m_type = nm_type_ switch m_type case vartype( "int" ) : m_EleSize = 4 : swbreak case vartype( "str" ) : m_EleSize = 1 : swbreak case vartype( "double" ): m_EleSize = 8 : swbreak default dialog "変数タイプの指定が無効です。",1,"newmod modvar , filemapping" : end swend m_bufsize = ( m_length * m_elesize ) if c_CreateFileMapping( INVALID_HANDLE_VALUE , 0 , PAGE_READWRITE , 0 , m_bufsize , varptr( m_objname ) ) { m_hMapObj = stat ErrCode = c_GetLastError() if c_MapViewOfFile( m_hMapObj , FILE_MAP_WRITE , 0,0,0 ) { m_lpData = stat dupptr nm_var_ , m_lpData , m_bufsize , m_type if ErrCode = ERROR_ALREADY_EXISTS { return ErrCode } else { return 0 } }else{ return -1 } }else{ return -2 } // オブジェクトとメモリーをcloseする ; 任意に使用しなくても終了時に自動的に実行される #modterm f_UnmapViewOfFile m_lpData f_CloseHandle m_hMapObj return #global

使用するには、まず、上のモジュールを、変数を共有したいスクリプトにインクルードして。


sharedkey "sharedvar_test" gdim gm_flg@ , 1 gdim gm_List@ , 5 gddim gm_point@ , 2 gsdim gm_string@ , 200

次に共有変数を定義した上の様なスクリプトを変数を共有したいスクリプトそれぞれに
ペースト、またはファイル化してインクルードしてください。



窓口

リンク

2010/6/5(Sat) 02:19:18|NO.33006

一応サンプルを載せておきます。

プロセス1

#include "変数共有化モジュール.as" #include "共有変数の定義.as" title "test1" button gosub "switch" , *label stop *label gm_flg@ ^= 1 return

プロセス2


#include "変数共有化モジュール.as" #include "共有変数の定義.as" title "test2" string = "" input string button gosub "add" , *label stop *label gm_String@ = strmid( string , 0 , 200-1 ) return

プロセス3

#include "変数共有化モジュール.as" #include "共有変数の定義.as" title "view" repeat cls mes strf(" %d : %s ",gm_flg@ , gm_String@ ) wait 1 loop



cv

リンク

2010/6/5(Sat) 17:15:11|NO.33025

窓口さん、うまくいきました。
ありがとうございました。解決です。



ONION software Copyright 1997-2023(c) All rights reserved.