人気ブログランキング | 話題のタグを見る

[CoveredCalc for BeOS] 表示しないウィンドウ

ここ数日(と言っても 1 日に数十分しかかけてないけど)初期状態では表示しないウィンドウをどうやって生成したらいいのか悩んでました。
BWindow はコンストラクタで生成した時点では、ウィンドウも非表示だし、そもそもスレッドが開始しておらずメッセージループも回っていません。また、コンストラクタを呼び出したスレッドによってロックされた状態になっています。
初回の Show() を呼び出すことで、スレッドが開始し、それによってメッセージループが回ります。また、ロックも解除されます。

しかし、カバーブラウザウィンドウは生成したあと、すぐには表示したくなかったのです。
(ユーザの操作によって表示状態の切り替えを行うので。デフォルトは非表示です。)

1) 生成時、Show() を呼ばずに放っておく。

→ ユーザの操作で Show() を呼び出すと、ウィンドウを生成したスレッド(今回の場合、BApplication のスレッド)とユーザの操作によるメッセージを受信したウィンドウのスレッドが違うので、初回の Show() で行われるロック解除に失敗しました。

2) 生成時、Show() を呼ばずに、Unlock() してみる。

→ ユーザの操作で Show() を呼び出すと、結局、ユーザの操作によるメッセージを受信したウィンドウのスレッドがロックしてないので、初回の Show() で行われるロック解除に失敗しました。

3) 生成時、Show() を呼ばずに、Unlock() して、Show() するときに初回であればロックする。

→ 初回の Show() かどうかを自分で判断しなければならないわけで、…それはイヤ。(試してません)

4) 生成時、Show() を呼ばずに、Run() を呼んでやる。(呼ぶなと Be Book に書いてあった気がするが)

→ ユーザの操作で Show() を呼び出してもうまくいった。…かのように見えたのですが、そのウィンドウのスレッド名に "w>" がついてません。通常は初回の Show() が何かやってるに違いありません。他の影響もまだ見えてないだけで、いずれ問題になりそうなので却下。

5) 【解決】生成時、一度 Hide() を呼んでから Show() を呼んでやる。

→ Hide() と Show() はカウンタを持っているので、Hide() → Show() だと、それをする前と同じ状態になります。つまり、非表示状態のままです。でも、その Show() は初回の Show() として認識されるようで、"w>" 付きのスレッドも生成されるし、ロックも解除されたようです。

とりあえず、これで解決できた、と思っています。
by hironytic | 2004-09-16 13:06 | 開発状況
<< [CoveredCalc fo... [CoveredCalc fo... >>