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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0903
秋味別ウィンドウ9未解決


秋味

リンク

2011/9/3(Sat) 12:01:00|NO.41044

Aルーチンで条件が一致したら新しいウィンドウにパラメータを渡して
そのデータを元にBルーチンを動作させたい
Aルーチンは動作を停止せず、新たにC、Dルーチンを生み出せるようにしたいのですが
どんな感じでやればいいのでしょうか?



この記事に返信する


backdrop

リンク

2011/9/3(Sat) 16:18:47|NO.41049

質問の意図が良くわからん
ただの分岐だったらon命令を使うかifとgosubをくみあわせる。



backdrop

リンク

2011/9/3(Sat) 16:22:30|NO.41051

追記
>新しいウィンドウにパラメータを渡して
とあるが、基本的にウィンドウをいくら作ろうと同一スクリプト内の変数は共通なので
受け渡しなんぞの処理は全く必要ない。



who

リンク

2011/9/3(Sat) 17:23:25|NO.41054

まぁ要はこういうことだろ

>>新しいウィンドウにパラメータを渡して
>とあるが、基本的にウィンドウをいくら作ろうと同一スクリプト内の変数は共通なので
>受け渡しなんぞの処理は全く必要ない。
>に同意。


randomize Aco=0 BBL=0 CBL=0 f=0 *main redraw 1:await 20:redraw 0 f++ color 0,0,0 boxf color 255,255,255 pos 0,0 //Aルーチン if f\10=0{ A1=rnd(9)+1 A2=rnd(9)+1 A3=A1*A2 Aco++ if Aco=30{BBL=1} } mes "Aルーチンは掛け算をします。["+A1+"×"+A2+"="+A3+"]" mes "Aルーチンが30回掛け算をしたらBルーチン[引き算]を起動します。" mes "掛け算した回数:"+Aco //Bルーチン if BBL { if f\5=0{ B1=A3 B2=rnd(A3) B3=B1-B2 Bco++ if Bco=50{CBL=1} } mes "Bルーチンは掛け算の結果に引き算します["+B1+"―"+B2+"="+B3+"]" mes "Bルーチンが50回引き算したらCルーチン[おわりー]を起動します。" mes "引き算した回数:"+Bco } if CBL{ mes "おわりー" } goto*main



秋味

リンク

2011/9/4(Sun) 00:12:19|NO.41067

説明下手ですいません

上記あげていただいた例みたいな
説明だと

Aルーチンではずっと5秒に一度
答えかける2を続け現在数値を表示する
1x2=2x2=4x2…
合計が一桁増えるとBルーチンを
別ウィンドウ起動して
ずっと10秒に一度
答えかける7を続け現在数値を表示する
1万を超えたらAのウィンドウに表示して
Bは終了する

というふうなBルーチンの結果を待たず
Aは計算し続け 条件が一致したら
Bが起動したりCが起動したりしたいのです



??

リンク

2011/9/4(Sun) 01:18:03|NO.41069

別のウインドウにパラメータを渡す方法など、複数のウインドウを管理する方法については分かっているんですよね。
5秒毎の処理と10秒毎の処理を同期する方法が分からないのでしょうか。

流れとしてはこんな感じだと思いますが。

screen 0 a = 1 // Aルーチンで計算する数を保持 b = 1 // Bルーチンで計算する数を保持 a_keta = 1 // Aルーチンの桁数を保持 (最初は一桁) b_flg = 0 // Bルーチンの実行フラグ repeat redraw 0 color 255, 255, 255 : boxf : color // 5秒に一度 if (w\5 == 0) { // Aルーチン gosub *A_routine } // 10秒に一度 (Bルーチンの実行フラグが立っている場合のみ) if (w\10 == 0 && b_flg == 1) { // Bルーチン gosub *B_routine } pos 10, 10 mes "A routine : " + a // 表示 pos 10, 25 mes "B routine : " + b redraw 1 w = cnt wait 10 loop stop *A_routine a *= 2 // 答えを二倍 keta = strlen( str(a) ) // 桁数を取得 // 桁が増えていれば if (a_keta < keta) { b_flg = 1 // Bルーチン実行フラグを立てる } a_keta = keta // 現在の桁数を保存 return *B_routine b *= 7 // 答えを7倍 // 10000を超えていれば if (b > 10000) { b_flg = 0 // Bルーチンの実行を終了する title "Bルーチンが10000を超しました" } return



TTRUKO

リンク

2011/9/5(Mon) 13:59:23|NO.41100

本格的なマルチスレッドをやろうと思ったらHSPの枠を超えた知識が必要ですが
そうでなければ大抵のことはアイデア次第で実現可能だと思います。

やりたいことによっても、実装方法は変わってきますけど
例題の通り、単に一定の時間ごとに処理をするだけなら、私はこんなコードを書くことが多いです。

#define MOUSE_LEFT 256 #define MOUSE_RIGHT 512 // メイン処理 screen 0, 480, 120 mes "左クリックで、ルーチンA開始(&終了)\n右クリックで、ルーチンB開始(&終了)" InitTime repeat stick key if ( key & MOUSE_LEFT ) { if ( IsStartA() = 0 ) { CreateA } else { DestroyA } } if ( key & MOUSE_RIGHT ) { if ( IsStartB() = 0 ) { CreateB } else { DestroyB } } WaitTime 30 loop stop // 時間取得 #module #uselib "winmm.dll" #cfunc TimeGetTime "timeGetTime" #defcfunc Timer return TimeGetTime() #global // ウェイト #module #deffunc InitTime _isInit = 1 _nextTime = Timer() return #deffunc WaitTime int inpTime ProcA ProcB if ( _isInit = 0 ) { _isInit = 1 _nextTime = Timer() + inpTime } else { _nextTime += inpTime } repeat if ( _nextTime <= Timer() ) { break } await 10 loop return #global // ----- A ----- #module #define WIN_ID_A 1 // 開始 #deffunc CreateA if ( _isStart = 0 ) { nowWinID = ginfo( 3 ) screen WIN_ID_A, 320, 240 _isStart = 1 _nextTime = Timer() + 1000 gsel nowWinID } return // 処理(1秒に1回「A」を表示) #deffunc ProcA if ( _isStart = 1 ) { if ( _nextTime <= Timer() ) { nowWinID = ginfo( 3 ) _nextTime += 1000 gsel WIN_ID_A mes "A" gsel nowWinID } } return // 終了 #deffunc DestroyA if ( _isStart = 1 ) { nowWinID = ginfo( 3 ) gsel WIN_ID_A, -1 _isStart = 0 gsel nowWinID } return // 起動チェック #defcfunc IsStartA return _isStart #global // ----- B ----- #module #define WIN_ID_B 2 // 開始 #deffunc CreateB if ( _isStart = 0 ) { nowWinID = ginfo( 3 ) screen WIN_ID_B, 320, 240 _isStart = 1 _nextTime = Timer() + 500 gsel nowWinID } return // 処理(0.5秒に1回「B」を表示) #deffunc ProcB if ( _isStart = 1 ) { if ( _nextTime <= Timer() ) { nowWinID = ginfo( 3 ) _nextTime += 500 gsel WIN_ID_B mes "B:" gsel nowWinID } } return // 終了 #deffunc DestroyB if ( _isStart = 1 ) { nowWinID = ginfo( 3 ) gsel WIN_ID_B, -1 _isStart = 0 gsel nowWinID } return // 起動チェック #defcfunc IsStartB return _isStart #global
メイン処理の中でawaitの代わりにWaitTimeを使えば
ルーチンA、ルーチンBはDestroyされるまで勝手に動き続けます(awaitは使わないようにする)

擬似的に並行処理しているだけのように見えますけど
Windowsなんかが、Wordやらメモ帳やらIEやらを同時にいくつも起動できるのも、実際は
内部でこういう処理をやっているだけです(もちろんこれとは比べ物にならないくらい高度な処理ですけど^^;)



TTRUKO

リンク

2011/9/5(Mon) 14:45:38|NO.41101

値の受け渡しとか、同じルーチンを複数起動させたいときの処理とかを入れるのを忘れてた…
まぁこれ以上は長くなりすぎるのでいいか(-▽-;



木村

リンク

2011/9/5(Mon) 20:54:45|NO.41115

 タイマーを使ってみるのはいかがでしょうか。優先順位が低いので大分適当なタイマーですが大雑把な挙動なら満足できるかと思います。
 具体的な利点や仕組みはちょくとさんのサイトをご覧ください。
http://chokuto.ifdef.jp/advanced/usertimer.html
 以下は一例

#include "user32.as" #include "hpi_exprogctrl.hsp" #define global TIMER_ID_A 10 #define global TIMER_ID_B 20 create_a stop #deffunc create_a screen 0, 320, 240, 0, 0, 0 title "ルーチンA用のウィンドウです" settimer hwnd, TIMER_ID_A, 700, deffptr(call_a) Aの値 = 1 mes "Aの値="+Aの値 return #deffunc call_a Aの値 *= 2 gsel 0 redraw 0 color 255, 255, 255 boxf 0, 0, 127, 511 color pos 0, 0 mes "Aの値="+Aの値 redraw 1 if (Aの値>=10) & (フラグ=0) : create_b : フラグ+ return #deffunc create_b screen 1, 320, 240, 0, 320, 0 title "ルーチンB用のウィンドウです" settimer hwnd, TIMER_ID_B, 1400, deffptr(call_b) Bの値 = 1 mes "Bの値="+Bの値 return #deffunc call_b Bの値 *= 7 gsel 1 redraw 0 color 255, 255, 255 boxf 0, 0, 127, 31 color pos 0, 0 mes "Bの値="+Bの値 redraw 1 if Bの値>=10000 { mes "ルーチンBの値が10000を超えました" title "ルーチンBを終了します" killtimer hwnd, TIMER_ID_B } return



lltakashill

リンク

2011/9/7(Wed) 17:15:13|NO.41170

タイマーということで、以前私が使用していたものは
http://goo.gl/MwIfj のmod_counttimer_210 というものです。
使いやすかったので参考にしてもらえれば幸いです。



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