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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
1202
(´ω`)タイトルバーの不思議17解決


(´ω`)

リンク

2010/12/2(Thu) 14:55:05|NO.36088

ちょいと不思議な現象についての質問です。
以下のソースで、


*lop   await 1   repeat 65536     title str(cnt)   loop   goto *lop

ものすごい勢いでタイトルバーの数値が変化するのはおわかりいただけると思いますが、
このときタスクマネージャを見ると、メモリ使用量がすごい勢いで増えていくんです。
上のソース的には、メモリぜんぜん食わなそうなのに……です。
(OSはWindows7です)

この現象って、Windowsの仕様でしょうか?
実はタイトルバーって更新するたびにメモリを消費していて、もし内容を煩雑に変更する
アプリをそのまま放置しといたら、とんでもないことになりますか?
または何かの勘違いでしょうか?(u゚ω゚ )



この記事に返信する


inovia

リンク

2010/12/2(Thu) 17:05:28|NO.36091

・Windows Vista Home Premium SP2 (32bit)
・HSP Ver 3.22

の 環境で試してみましたが使用メモリがどんどん増えていく現象は確認できずです。



hexa.hemi

リンク

2010/12/2(Thu) 17:28:02|NO.36092

Windows XP Home Edition SP3
HSP 3.22
で検証しましたがinoviaさんと同じくメモリ使用量は増えませんでしたが、
CPU使用率が増えました。



panda

リンク

2010/12/2(Thu) 17:33:27|NO.36093

ほんとうだ・・・。(´Д`!!

2回試してみましたが、再起動2回するハメになりましたよ。恐ろしいコードです・・・。
というのは、まずCPUが100%食われます。デュアルコアでも100%食われます。そして、操作不可能になり…
タスクマネージャーでメモリがどんどん食われていくのを黙ってみるしかなくなります・・・。

上記の方から見て、Windows 7 特有の現象なのでしょうか。下述する私の環境に近い方は気をつけてください。
というか、覚悟して実行してください。

*環境
OS : Windows 7 Ultimate / 64bit
HSP : 3.21
CPU : Intel Core2 E8000系 3GHz
RAM : 4GB

投票者コードだと無限ループでコンピュータが動作不可能になるかもしれないので
ループ回数に制限のある以下のコードで試してみてください。


exec "taskmgr" : mes "開始します メモリ使用率:"+sysinfo(33)+"%" repeat 5 a++ mes ""+a+"/3回目のループ メモリ使用率:"+sysinfo(33)+"%" await 1 repeat 65536 title str(cnt) loop loop mes "終了(フリーズしてると思います。しばらく立つと終了します)" : wait 100 end



check

リンク

2010/12/2(Thu) 17:36:37|NO.36094

Window 7 64bitで試したところ、
氏の言っていることと同じような現象が出た。

分かりやすくするために、

*lop   await 10   repeat 65536     title "hsp" + str(cnt)   loop   goto *lop
と変えて実行してみたが、実行したとたんにOS全体が重くなり、
メモリの使用率を確認することすらままならなくなった。
その後、フリーズとまではいかなかったものの、
プログラムを終了することすら困難なのでリセットした。



panda

リンク

2010/12/2(Thu) 17:44:22|NO.36095

やはり、Windows 7 には地雷コードみたいですね。本当にリセットするほどキケンなので注意願います。
投票者さんは 64bit なのでしょうか。

ところで、いろいろ試してみたところ、Aero を切ってみたところ(basicスタイル)この現象はなくなりました。
また、直接APIを経由しても動作がおかしくなるので、また、Vistaではなく、7限定から、DWM1.1のバグだと思います。


#include "user32.as" exec "taskmgr" : mes "開始します メモリ使用率:"+sysinfo(33)+"%" repeat 5 a++ mes ""+a+"/5回目のループ メモリ使用率:"+sysinfo(33)+"%" await 1 repeat 65536 SetWindowText hwnd,str(cnt) loop loop mes "終了(フリーズしてると思います。しばらく立つと終了します)" : wait 100 end



check

リンク

2010/12/2(Thu) 17:45:14|NO.36096

どうやらハードページフォールトが発生しているな。
どうしてこんなことになったかは分からないが、
とてつもなく重くなるのは理解できた。



Hatter

リンク

2010/12/2(Thu) 18:05:14|NO.36098

OS : Windows 7 HomePremium(32bit)
CPU: Intel E7500(Core 2 Duo,2.93GHz)
RAM: 4GB
HSP: 3.21
--------------------------------------------------------------
pandaさんのスクリプトを実行したら、
メモリ使用量がどんどん増加しCPU使用率は100%になりました。
(経過をより見るために:repeat 3 => repeat 20にしました。)



KA

リンク

2010/12/2(Thu) 19:27:02|NO.36099

WIN7-64BIT
PhenomIIx4 3GHz
MEM 8G
HSP 3.21

AWAIT 1 なので、CPUリソースを食いつぶして、重くなるのは分かる。
(1コアのみ100%近く)
ただ、数十分動かしたがメモリ使用量は変化せず。

AEROは使っていない。



KA

リンク

2010/12/2(Thu) 19:38:37|NO.36100

WINXPsp3-32BIT
Intel T2300 1.66GHz
MEM 1G
HSP 3.21

AWAIT 1 なので、CPUリソースを食いつぶして重い。
(1コアのみ100%近く)
ただ、数分動かしたがメモリ使用量は変化せず。

終了させようとしても(終了する)反応が遅い。



hexa.hemi

リンク

2010/12/2(Thu) 21:31:59|NO.36104

KAさんとpandaさんがAeroを無効にするとメモリ使用量が増えなくなることから、
WindowsのAero特有の問題なのでしょうか。



inovia

リンク

2010/12/3(Fri) 08:11:41|NO.36110

Vista+Aero環境で試してみたところ、操作不能となり電源落として再起動する羽目になりました。



(´ω`)

リンク

2010/12/3(Fri) 08:45:59|NO.36111

うお、ものすごいレス量!Σ(´Д`u)

テスト環境の説明が乏しかったですね、申し訳ありません。
皆さんがおっしゃられる通り、Windows7 Proの64bit、Aero使用下でのテストでした。
より具体的に動作を書きますと、

 1:タスクマネージャーを立ち上げといて、実行
 2:当初はカウンターが目まぐるしく変化、使用量も変化なさそう
 3:ある瞬間、カウンターが一瞬固まる
 4:カウンターがまた変化を始める、と同時にメモリ使用量がぐんぐん右肩上がりに
 5:×ボタンにカーソルを合わせた瞬間、カウンタが固まるが使用量はまだぐんぐん伸びる

でした。この後、×ボタンを押せば延々とメモリ解放作業をした後に終了はできたのですが、
あるいはこれはデュアルコアだったからなのか。

しかしこれは、実際のところどうなんだろう……自作ソフトを配布する場合はやはり、
Aero環境下も想定してタイトルバーは煩雑に書き換えない方がいいのか、あるいは一定の
waitを挟んでで回す分には問題ないのか。
タイトルバーは手軽に情報表示できるので、フル活用しちゃうんですよね。

ちょいと悩ましい現象です。(u´ω`)



(´ω`)

リンク

2010/12/3(Fri) 10:51:08|NO.36113

pandaさんのおっしゃってたDWMについてググったり色々つついた結果、つまりこれは
こういう現象だという解釈でOKでしょうか?

1:Aero環境では、全てのアプリケーションの描画情報はDWMが管理し一旦バッファに書き込む
  そこでいろんな演算(透過処理など)をした後に画面に吐き出す
2:waitなしでタイトルバーを高速に変化させると、DWMがバッファを解放する間もないほど
  次々と描画情報が送られてしまう
3:DWMが狂ったようにバッファを確保しまくり、メモリがみるみる消えてゆく

通常はwaitをループ間に挟むから、なかなか気づきにくい仕様(?)ってことなのかな。
つか、これはMicrosoftさんになんか対策とってもらいたいような。(u´ω`)


解決にチェックしておきます。(´ω`)



KA

リンク

2010/12/3(Fri) 16:55:44|NO.36114

解決にしているようですが。

>>あるいは一定のwaitを挟んでで回す分には問題ないのか。
 自分でやってみましょう。

>>通常はwaitをループ間に挟むから、なかなか気づきにくい仕様(?)
 仕様と言うか、無限ループに近い実装では致し方無いのでは?

>>タイトルバーは手軽に情報表示できるので、フル活用しちゃうんですよね。
 こんなに高速で表示させても、見えないのでは?



SYAM

リンク

2010/12/3(Fri) 21:56:57|NO.36115

>KAさん

失礼ですが、たまにケチつける必要のないところにムリにケチつけてる感がありますよね。

問題のあるなしは見た目だけでは分からないところもあります。
見た目ちゃんと動いて見えてるけど実は……ということだってありえます。

また、ソフトウェアにどのような機能をもたせるかはケースバイケースです。
全貌の分からないソフトウェアの一機能だけを見てそれに意味がないという指摘にこそ、意味がありません。



KA

リンク

2010/12/3(Fri) 23:54:35|NO.36116

>>失礼ですが、たまにケチつける必要のないところにムリにケチつけてる感がありますよね。

 う〜ん、そう見られるのか。
 率直な意見のつもりでしたが、以後気をつけます。
 (たしかに、解決済みに意見するのは余り良くないですね)

 スレ汚し、失礼しました。



HLAG

リンク

2011/3/18(Fri) 20:46:42|NO.37682


*lop   await 1   repeat 65536 await 1     title str(cnt)   loop   goto *lop
ならいけると。



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