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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0128
スペースウィンドウドラッグ中の処理について13解決


スペース

リンク

2016/1/28(Thu) 10:44:17|NO.74337

ウィンドウドラッグ中は処理が一時停止しますよね。
その間も処理を続けたい・・・ということで調べたのですが理想的なものが出てきません。
前に調べた時は自然に処理が続行方法があった気がしたのですが、
今調べるとウィンドウタイマーを使って割り込ませる方法しか出てきません。
これだとドラッグした瞬間は処理が止まってしまいます。
それなら妥協してとりあえず組み込もう・・・と思ってやったのですが、
やりたい処理は「ループ中にある値が代入されるとbreakでループを抜ける」という物です。

#uselib "user32.dll" #func SetTimer "SetTimer" int,int,int,int #func KillTimer "KillTimer" int,int #define WM_TIMER 0x0113 oncmd gosub *OnTimer, WM_TIMER onexit goto *OnQuit SetTimer hwnd, 1, 100, 0 repeat if cnt=10:break title ""+cnt await 500 loop stop *OnTimer ; ====== タイマーメッセージの処理 ====== return *OnQuit ; ====== 終了時の処理 ====== ; タイマーを破棄 KillTimer hwnd, TIMER_ID end
ドラッグ中は割り込み処理で*OnTimerの処理はされるのですが、戻ってきてもループ内の処理はされないので意味がありません。
じゃあ*OnTimerにループ内の処理を書こう、と思いやったのですがそれだとbreakが使えない・・・
(コンパイルの段階で「 repeatループ外でbreakが使用されました」とエラーが出る。)
前はもっといい方法があった気がするのですが、もし知っている方が居ましたら教えて下さい。



この記事に返信する


InoueSoftwear(元Rich)

リンク

2016/1/28(Thu) 16:42:39|NO.74338

ウィンドウドラッグで処理が止まるのは仕様ですので、
ウィンドウタイマーを使うのが良いと思います。
あと、ウィンドウタイマーにはcntみたいなカウント命令がないので、
変数を使いカウントしていきます。

#uselib "user32.dll" #func SetTimer "SetTimer" int,int,int,int #func KillTimer "KillTimer" int,int #define WM_TIMER 0x0113 oncmd gosub *OnTimer, WM_TIMER onexit goto *OnQuit TIMER_ID=1 SetTimer hwnd, TIMER_ID, 100, 0 i=0 stop *OnTimer ; ====== タイマーメッセージの処理 ====== ;wparam ... タイマーID if wparam=TIMER_ID{;TIMER_IDのタイマーが発生した i++;iの数値に1を足す if i=10:KillTimer hwnd, TIMER_ID;タイマーを削除する title ""+i } return *OnQuit ; ====== 終了時の処理 ====== ; タイマーを破棄 KillTimer hwnd, TIMER_ID end



スペース

リンク

2016/1/28(Thu) 16:49:29|NO.74339

ループ内で変数の値がある値になったら抜けたいのですが、その場合どう組めば良いのでしょうか?



葡萄色

リンク

2016/1/28(Thu) 19:02:54|NO.74341

「;タイマーを削除する」の行のif命令の条件を変えてあげればいいと思います



スペース

リンク

2016/1/28(Thu) 19:04:14|NO.74342

すみません、何に変えれば良いのでしょうか?
本当に質問ばかりで申し訳ありません。



科学太郎

リンク

2016/1/28(Thu) 21:07:00|NO.74345

> if i=10:KillTimer hwnd, TIMER_ID;タイマーを削除する
この行を

> if i=20:KillTimer hwnd, TIMER_ID;タイマーを削除する
この行などにする。



スペース

リンク

2016/1/28(Thu) 21:10:37|NO.74346

うぅ〜ん何度読み返してもInoueSoftwear(元Rich)さんと葡萄色さんに言いたいことが伝わってない気がする。

repeat title ""+ct if ct=9:break ct+1 await 100 loop Dialog "抜けられたよ!"
これが最小のプログラムです。
これをドラッグ中も処理を続けたい。ということです。
実際に使うプログラムでは上のプログラム自体がループの中にあります。
InoueSoftwear(元Rich)さんの方法だと結局stopで処理が止まってしまうので、使うことが出来ません。



科学太郎

リンク

2016/1/28(Thu) 21:22:24|NO.74347

次のサンプルで期待通りになると思います。

#include "User32.as" #define WM_TIMER 0x0113 oncmd gosub *OnTimer,WM_TIMER SetTimer hwnd,1,100,0 ct=0:swQuit=0 repeat if(swQuit):break await 5 loop Dialog "抜けられたよ!" stop *OnTimer title ""+ct if(ct==9){ KillTimer hwnd,1 swQuit=1 } else{ ct++ } return



スペース

リンク

2016/1/28(Thu) 21:25:37|NO.74348

>>科学太郎さん
ドラッグ中でもctが9になったらDialogを表示できれば完璧なのですが・・
サンプルを組んで頂いたのに申し訳ない。
でも言いたいことは伝わっているようでよかったです。
やはりドラッグ中に完全に処理を続けるのは難しいんですかね・・・



科学太郎

リンク

2016/1/28(Thu) 21:37:10|NO.74349

> ドラッグ中でもctが9になったらDialogを表示できれば完璧なのですが・・
やっぱりね。

> やはりドラッグ中に完全に処理を続けるのは難しいんですかね・・・
ドラッグ処理を自前で行うか、
SendInput 関数でマウスの左クリックのボタンが離されたと送信するか。
この2つぐらいしか実装方法が思い浮かびません。



InoueSoftwear(元Rich)

リンク

2016/1/29(Fri) 18:14:09|NO.74355

簡単に言うと、repeat〜loop間の間に別のラベルにジャンプする命令があり、
そのラベルで処理するような感じです。

repeat if ct>9:break gosub *label wait 10 loop stop *label;OnTimerのような感じ ct++ title ""+ct if ct>9:Dialog "抜けられたよ!" return
repeat〜loop間が終わった後のDialog表示は、"if(ct==9){"の後に書きます。
"KillTimer hwnd,1"はbreak(ループから抜ける)のと似たようなはたらきです。

#include "User32.as" #define WM_TIMER 0x0113 oncmd gosub *OnTimer,WM_TIMER SetTimer hwnd,1,100,0 stop *OnTimer title ""+ct if wparam=1{//1つ目のループ if(ct==9){ Dialog "抜けられたよ!(1)" KillTimer hwnd,1 SetTimer hwnd,2,100,0 ct=0 } else{ ct++ mes "カウント:"+ct } } if wparam=2{//2つ目のループ if(ct==9){ Dialog "抜けられたよ!(2)" KillTimer hwnd,2 } else{ ct++ mes "カウント:"+ct } } return
こういうことでしょうか?



掘木

リンク

2016/1/30(Sat) 17:43:03|NO.74365

>>スペースさん
私個人としてはそのプログラム構造に拘る理由がよくわかりませんが…そんなことはどうでもいい。

ウィンドウ移動によってwait/awaitでブロッキングが発生すること自体は回避できません。
(DispatchMessageがそういうブロッキングしてるってはじめて知ったよ。)

なら、wait/await命令であることを諦めればどうだろうか。

以下のようにマクロ化すればなんとかwaitっぽい見た目を確保した何かが作れます。
(このままだと複数ウィンドウに対応してないけどそれくらいはうまく改造しようネ)
メイン実行部がひとつのサブルーチンになってるっぽく見えるから
そこまで違和感はないかもしれない?

// <おまじない> #uselib "user32.dll" #func global SetTimer "SetTimer" int,int,int,int #func global KillTimer "KillTimer" int,int mcr_hwnd@ = hwnd #define customwait(%1) %tcw \ SetTimer mcr_hwnd@,9983 , %1 , 0 :\ oncmd gosub *m%i,0x0113 :\ return 0 : \ *m%o : \ KillTimer mcr_hwnd@,9983 gosub *main stop *main // <メイン実行部分> repeat 500 redraw 0 color 255,255,255:boxf pos 0,0:color mes cnt redraw 1 customwait 10 // waitの改造品? loop repeat 200,2000 redraw 0 color 255,255,255:boxf pos 0,0:color mes cnt redraw 1 customwait 50 loop dialog "おわり" // <メイン実行部分ここまで> // <やむなく増える末端のreturn>返り値はWM_TIMERの規定により0を与えましょう。 return 0
最初のメインブロックインから最初のcustomwaitまでが通常実行、
以降はtimerイベントによるイベント実行となるね。


・・・ところでなんでうちのWimaxが掲示板書き込み禁止になってるんだろ。。。そんなに害悪だったか?



スペース

リンク

2016/1/30(Sat) 18:35:28|NO.74367

このプログラムは、昨日立てたwaifu2x GUIで使うことを想定しています。
http://hsp.tv/play/pforum.php?mode=all&num=74340

詳しい部分は割愛しますが、
メインプロセスからサブプロセスに共有メモリでファイルのリストを渡し、
サブプロセスはそのファイルを処理します。
サブプロセスは1つファイルの処理が完了毎に値を共有メモリに書き込みます。
その間、メインプロセスは

repeat ファイル数//ファイル数 repeat //待機中 //共有メモリの値を取得する処理。値がifの条件を満たしていたらbreak。 loop loop
こんな感じの処理をしています。
従ってInoueSoftwear(元Rich)さんの方法を使うことは出来ません。
No.74346で「実際に使うプログラムでは上のプログラム自体がループの中にあります。」と書いたのですが、
失礼ですがしっかり読んでいるとは思えません・・・

>>掘木さん
ありがとうございます。
理想通りの動きです。
やはりドラッグ中に処理を続けるのは結構面倒なんですね。
この質問は解決とします。皆さんありがとうございました。
(もし時間があるなら、:\とか\の意味を教えて頂けると嬉しいです・・・)



zero

リンク

2016/1/30(Sat) 23:22:50|NO.74375

"\"は#defineマクロを書く際に複数の文を改行して
書けるようにするための記述方法です。
例えば
#define MAC1 \
a = 1 :\
b = 2
と書くと、MAC1 は
a = 1 : b = 2
のように展開されます。


>>掘木さん
私のWiMAXも書き込み禁止になっています。
(私だけなのかと思ってました)



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