パスワードを忘れた? アカウント作成
271987 journal

dodaの日記: ブロードキャストコマンドの対象ウィンドウ数 7

日記 by doda

ブロードキャストコマンドで 51 枚目以降のウィンドウに送信が出来ないという話が出た。

これはウィンドウを管理しているリスト(配列)のサイズが 50 になっているから。
51 個目以降のウィンドウはこのリストに登録されない。
ブロードキャストはこのリストを利用する為、このリストに登録されていないウィンドウには送信できない。
このリストはブロードキャストコマンドの他にも、「ウィンドウ」-「ウィンドウ」で出てくる「ウィンドウのリスト」ダイアログや
Ctrl-TAB でのウィンドウ切り替えでも利用していて(元々はこっちの為にあったリスト)、登録されないウィンドウはこれらでも対象外になる。

要望では対象となるウィンドウ数を設定で変更できるようして欲しいという事だったが、ウィンドウリストは共有メモリ上にあり
すべてのTera Termウィンドウで共有されているので、設定で動的にサイズを変えられるようにするのは面倒そうだった。
# 可変長にすればいいんだろうけれど、関連しそうな所を調べるのが面倒で…結局は手抜きか
という事でリストのサイズ変更じゃ駄目?と訊いた所、OK との返事が。
それじゃどれくらい必要かという質問には、

当方といたしましては現状約200枚の同時起動のパターンがありましたので 想定している最大値としては256枚を考えております。

という返事が。
同時に 200 枚とは中々の強者。
# というか、ちゃんと動くんだと思ったり(^^;

方針が決まったので、要望に従ってウィンドウリストのサイズを 256 へ変更。これ自体は簡単。
問題なのは動作確認。
一枚ずつウィンドウを開くのは面倒なので、必要な枚数のウィンドウを開いた後に exit をブロードキャストする、以下のようなマクロを作った。

MaxWin = 210
constr = "ssh://sue@nagato /auth=pageant /W=%03d /X=%d /Y=%d /SIZE=80x24"
prompt = "sue@nagato"
mcastname = "test"
 
xn = 10
xd = 120
yd = 40
yb = (MaxWin-1) / xn * yd
 
for i 1 MaxWin
    sprintf constr i (i-1) % xn * xd yb - (i-1) / xn * yd
    connect inputstr
    wait prompt
    sendln "unset HISTFILE"
    setmulticastname mcastname
    if i <> MaxWin unlink
next
 
pause 5
sendmulticast mcastname "sleep 5; exit"#13

まずは元々の問題の確認という事で、4.67 リリース版で 55 枚のウィンドを開いてみようとした。
すると、20 枚目位から動作が非常に遅くなってきた。
どうやら、半透明で使っている事が原因のようで、半透明のウィンドウが何枚も重なっている状態の描画が重いようだ。
結局 30 枚程度で耐えられずにマクロを停止。半透明を無効にして再度試す事にする。

既に開いている 30 枚のウィンドウを閉じようとして、ブロードキャストコマンドで exit を送る。
すると zsh が一斉に .zshhistory へヒストリを書き込もうとし、結果 .zshhistory が壊れた。orz
ヒストリを失ったのは少し悲しかったけれど、同じ轍を踏まないように、ログイン直後に unset HISTFILE するようにマクロを書き換えた。

気を取り直して、半透明を無効にしてから再度テスト。
予定通り 51 ~ 55 番のウィンドウを残してウィンドウが閉じた。

次に修正版の動作を確認する為に 55 枚のウィンドウを開いた。
これも予定通り全ウィンドウが閉じた。

念のため 200 枚オーバーを試そうと MaxWin を 210 に設定してテスト。
しかしなぜか 80 枚目辺りのウィンドウでログインが進まなくなった。
ログインが進まなくなったウィンドウをよく見ると、メニューバーが出ていない。
おそらくデスクトップヒープが足りなくなったんだろうと判断し、レジストリをいじって 8MB に増やした。

OS を再起動後、再度 210 枚で試すと無事に 210 枚開けた。
が、間違えて 4.67 リリース版を起動していた。
当然 50 枚しか閉じず、泣きそうになりながら残った 160 枚のウィンドウを必死に閉じてまわった。

全ウィンドウを閉じた後、修正版で再度 210 枚のテスト。今度は無事に開けた。 [開いた状態]
しかし、その後に exit をブロードキャストした時になぜか 80 枚程度のウィンドウにコマンドが送られなかった。
最初、ブロードキャストしている間にブロードキャスト元のウィンドウが閉じてしまったためかと思ったが、
よく見るとブロードキャスト元のウィンドウにも送りそこなっているのでこれは違う。
色々考えた結果、ブロードキャストしている間に前半のウィンドウが閉じたため、ウィンドウリストがリナンバリングされた事が原因だと結論づけた。
うーん。これって対応した方がいいのかなあ。後で考えよう。
とりあえずは送るコマンドを "sleep 5; exit" にして閉じるタイミングを遅らせたところ全部閉じるようになった。

残件は exit を送った時に送れないウィンドウが出る事への対応か。
とりあえずはチケットに登録しておいた。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...