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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0821
ぴょぴょHSPのウインドウ管理について9解決


ぴょぴょ

リンク

2014/8/21(Thu) 15:31:38|NO.64113

[質問1]
screen命令、bgscr命令でウインドウが作成できますが、
内部では screen 0 がウインドウ・プロシージャがあるIDで、
ID が 1 以上のウインドウがモードレス・ダイアログと同じ
ウインドウと見て良いのでしょうか?

つまり、screen 0 は必ず内部では存在していて、
このウインドウが他のウインドウを管理してるのか。

[質問2]
bgscr命令で作成されたウインドウを非表示にすることは可能ですが削除することは可能ですか?
現在、サイドバー・ランチャーを作成中で、ウインドウ構造を次のようにしてます。

screen 0(設定ダイアログに使う)

bgscr 1(サイドバーのウインドウ)
├bgscr 2(日付ペイン)
├bgscr 3(時計ペイン)
├bgscr 4(天気ペイン)
├bgscr 5(CPU使用率ペイン)
│ :
├bgscr 17(設定ペイン)
└bgscr 18(終了ペイン)

上記の構造は、SetParent 関数で「bgscr 2」〜「bgscr 18」を「bgscr 1」の子ウインドウにしてます。
そして、起動後の設定でペイン数が「bgscr 10」までに減った時、
「bgscr 11」〜「bgscr 18」を削除したいのです。

これはウインドウのメモリを少しでも減らしたいという考えです。
現在の対策では、未使用のペイン・ウインドウのサイズを1×1ドットの大きさで非表示にしてます。
この方法以外でHSPのウインドウ管理のメモリ量を減らす方法ありますか?



この記事に返信する


Flat (元Tetr@pod)

リンク

2014/8/21(Thu) 16:12:02|NO.64115

>削除することは可能ですか
end命令やrun命令を使用すればすべての情報(変数その他含む)を破棄します。
それ以外では出来ないようです。

>screen 0 は必ず内部では存在していて
YES
ウィンドウは破棄できないため一度作成されたら終了するまで存在し続けます。

>このウインドウが他のウインドウを管理してる
NO
screen0はオーナーウィンドウではありませんし、
ウィンドウプロシージャはすべてのウィンドウが持っています。


詳細はHSPランタイムのソースコードを参照してください。



Flat (元Tetr@pod)

リンク

2014/8/21(Thu) 16:17:50|NO.64116

追記
DestroyWindowを直接呼べば削除し放題ですが、動作が不安定になると思います。
但し、自前でウィンドウを作成・管理すれば安全に削除出来ます。



kanahiron

リンク

2014/8/21(Thu) 16:24:52|NO.64117

そのまま何も考えないでDestroyWindw hwndをやったらメモリ全く減らないでプロセスだけが残りました()
また一度削除すると同じIDでwindowが作れなるようです
flatさんの通り、CreateWindowで自前でウィンドウを作らないと難しそうです



ぴょぴょ

リンク

2014/8/21(Thu) 17:02:53|NO.64119

Flat (元Tetr@pod)さんへ

> ウィンドウプロシージャはすべてのウィンドウが持っています。
そうですよね。
そうなると HSP のスクリプト・エンジンのウインドウは、何処かにあるのでしょうか?

> 詳細はHSPランタイムのソースコードを参照してください。
HSPのソースコードは、どこで見れるのですか?

> 但し、自前でウィンドウを作成・管理すれば安全に削除出来ます。
これは winobj 命令でもOKですかね?
CreateWindowEx なら安全に管理できますが…。


kanahironさんへ
> そのまま何も考えないでDestroyWindw hwndをやったらメモリ全く減らないでプロセスだけが残りました()
そうでしょうね。

> また一度削除すると同じIDでwindowが作れなるようです
HSPの内部で色々と管理してるようですから DestroyWindw 関数が使えないのは、
ある意味当然でしょう。→だから質問してみた。



Flat

リンク

2014/8/21(Thu) 17:36:42|NO.64122

>HSPのソースコード
http://dev.onionsoft.net/trac/openhspから辿れば入手できます。

>HSP のスクリプト・エンジンのウインドウ
スクリプト・エンジンはウィンドウに付属しているのではなく、ウィンドウとは独立して動作しています。

>winobj 命令でもOKですかね
winobjはwinobjでHSPランタイムの管轄なので、screen同様やめておいたほうが無難です。
管轄外なら(自己責任で)何をやってもランタイムの動作には支障をきたしません。



ぴょぴょ

リンク

2014/8/21(Thu) 18:10:44|NO.64123

> http://dev.onionsoft.net/trac/openhspから辿れば入手できます。
オープン・ソースになっていたのですね。

> スクリプト・エンジンはウィンドウに付属しているのではなく、ウィンドウとは独立して動作しています。
そうでしたか。

> winobjはwinobjでHSPランタイムの管轄なので、screen同様やめておいたほうが無難です。
そうですね。
独自にウインドウを管理した方が安全ですよね。
そうなると結論としては、ウインドウを一度作成したら非表示で隠すぐらいしかできないと言う事ですね。



あり

リンク

2014/8/21(Thu) 18:51:59|NO.64128

既に試されているようにも見えますが
同じウィンドウIDをbgscr ID, 0, 0で再初期化する事でも
メモリ使用量は減らせるようですし、安全だと思います。

自分の環境では初期設定(640x480)で20枚bgscrでウィンドウを作成して
メモリ使用量20.5MBだったのが、サイズ0x0で再初期化する事で
3.0MBにメモリ使用量が減りました。
(ちなみに初期ウィンドウ1枚のみでのメモリ使用量は2.9MBでした)



ぴょぴょ

リンク

2014/8/21(Thu) 19:01:26|NO.64129

ありさんへ

> メモリ使用量20.5MBだったのが、サイズ0x0で再初期化する事で
サイズが0×0で再初期化できますか?
私のVer.3.3.2ではエラーとなりますが…。



あり

リンク

2014/8/21(Thu) 19:59:42|NO.64132

>サイズが0×0で再初期化できますか?
>私のVer.3.3.2ではエラーとなりますが…。

あれ?、改めて試したら確かにエラーになりますね、失礼しました。
bgscr ID, 1, 1に訂正します。



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