Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

なんともタイトルをつけにくいある日の出来事

今の仕事のチームメンバーの一人、Hには、大した仕事が与えられない。
単純作業だが量が多いものなどが、彼の担当になることが多い。
チームリーダーのTは、Hも同席しているミーティングの場で「Hさんにもできることはあるかな…」などと口にする。

そんなHに先週任された仕事は、以下のようなものだ。
フォーム上に検索条件を入力してボタンを押すと、DBから条件に合致するデータを取ってきて、グリッドに一覧表示する。
このとき、ボタンを押してから表示が完了するまでは、カーソルを待ち状態にし、検索ボタンを無効にしろというのだ。
検索処理中に見た目が変わらないと、本当に検索しているのか分からず、検索ボタンを連打してしまう可能性があるためだ。
DBに対して検索するすべての画面で必要な処理だから、まさに大量の単純作業だ。

俺は、ボタンのClickイベントでForm全体をDisableにしてしまい、処理が終わったらEnableにすればいいと思っていた。慎重を期すなら、EnableにするコードはFinallyブロックに書いてもいい。
対して、Hが出した案はこうだ。
コントロールをDisableにすると、グレーになって醜い。
モーダルダイアログを出している間は、親画面はグレーでなく操作ができない状態になる。これを利用すればいい。
では、検索中にモーダルダイアログを出すようにするのか? と言うと、「ユーザにはダイアログが見えないようにする」と言う。
百歩譲ってダイアログをよしとしたところで、その見えないダイアログを誰が閉じる?
モーダルダイアログは、閉じられるまで親の実行を阻害する。ダイアログ自身によって閉じられないのであれば、別のスレッドから閉じるしか無いが、Hにはそのあたりが分かっていないらしい。
コントロールをグレーにするのは醜いから嫌だと顧客に言われたわけでもないのに、敢えて茨の道を突き進もうとする姿勢には頭が下がる。
ちなみに、その処理は結局、画面内の各コントロールをDisableにするということで話がついたようだ。

Hが、ある画面についてその実装を終え、テストをしていると、ある問題が発生して、俺が呼ばれた。
検索中にボタンをDisableにし、検索が終わったらEnableにしているのだが、Disable状態のボタンをクリックしても、一度検索が終わった後で再度検索処理が走ってしまうというのだ。
その挙動を見て、ピンとひらめいた。あぁ、メッセージがキューにたまっていて、Enableになった直後にそれが処理されるからだと。
そこで、検索終了後、ボタンをEnableにするまえにDoEventsを入れて、強制的にメッセージを消化させることで対処した。

Hは、DoEventsの一行を入れるだけで、どうして問題が解決するのか分からないと言った。
チームには、Hと同じ会社から出向してきているKがいる。KはHの先輩で、普段Hを直接監督しているのはこのKだ。
余談だが、KもHも俺より年上である。
ボタンの問題を解決したとき、たまたまKも同じ場に居合わせたので、Kも一緒になって理由を聞きたがった。
そこで、2人に聞いてみた。CあるいはC++でWindowsプログラムを作ったことはあるか? と。
2人の答えは、いずれも「No」だった。
メッセージキューの仕組みを簡単に説明はしたが…うーむ…

投稿日時 : 2007年7月18日 20:09

Feedback

# re: なんともタイトルをつけにくいある日の出来事 2007/07/18 20:52 囚人

「いつまでもメッセージキューを意識せねばならないフレームワークやクラスライブラリに問題がある」と斜め上から見当違いの偉そうなことを言ってみる。
てへっ。

# re: なんともタイトルをつけにくいある日の出来事 2007/07/18 22:25 ダッチ

> Form全体をDisableにしてしまい
こうすると Form が後ろに隠れる場合があるので厄介だったりします。かといって Form 全体に Panel などを配置して、その Panel を Disable にするのも嫌。

# re: なんともタイトルをつけにくいある日の出来事 2007/07/19 0:29 まどか

何度目でも何事も無く正しく動作することが大事。
と言ってみる。

私の答えも「No」であることは秘密。
#VB6から呼びたいがためのラッパくらいはありんす。

# re: なんともタイトルをつけにくいある日の出来事 2007/07/19 11:54 とっちゃん

帰りしなに読んだので今頃コメントw

メッセージキューの説明。ガッツりやらねーとダメっすか?
土曜日のネタどこにボリューム割くかまだ決めてねーのだよww

がっつりやるとなると...Win16 時代の動きも説明しねーといけねーよなぁ...w

#協調型マルチタスクだから、こんな仕組みだと...w

# re: なんともタイトルをつけにくいある日の出来事 2007/07/19 12:41 ddnp

あれですね。
内情(メッセージループの仕組みとか)を知らんでも
モノが作れちゃうから・・・ってやつでしょうか。

DoEventsってVBのキーワードでしたっけ
それで以前、何か落とし穴に落ちた気がする。

# re: なんともタイトルをつけにくいある日の出来事 2007/07/19 14:02 Ognac

皆さんが仰られているように、仕組みを知らなくてもアプリを作れる良い時代になったと最善意に解釈してみる。
スレッドの概念のないプログラマーも周囲にいたりするので...orz.
彼らの頭には、おまじない構文がTipsとして蓄えられている模様

# re: なんともタイトルをつけにくいある日の出来事 2007/07/19 15:40 とっちゃん

スレッドは、体を使って覚えるとすげーよくわかるっすよ。

同期処理は、「だるまさんがころんだ」。
本格的な ManyCore 時代を迎える前に、どうしてこれで同期処理が説明できるか、理論的に考えて説明させてみるとよいでしょう。
#地方によって呼び名が異なるので注意が必要

競合問題は、トランプゲームのスピード。デッドロックの発生する仕組みが本当に体感できます。
#できなきゃできるまでひたすら続けてください。
#マルチスレッドのデバッグの方法もこれで解説可能ですwww

他にも色々ありますが、この二つが体感するには一番だと思いますよwww

他にも、ハンカチ落とし、フルーツバスケット、椅子取りゲームなんかはお勧めw

#え?ネタばれだって?大丈夫。当分やる予定ないからww

# re: なんともタイトルをつけにくいある日の出来事 2007/07/19 17:51 Ognac

>だるまさんがころんだ
>トランプゲームのスピード。デッドロックの発生する仕組みが本当に体感できます。
うっ。うまく説明できそうにない。修行積んできます。
スレッドとSQLストアードでとんでもなことがあったので次回のネタにでも。

# re: なんともタイトルをつけにくいある日の出来事 2007/07/19 18:11 とっちゃん

実際に頭の中で動きをデバッグトレースするとよくわかるっすw
#スピードは一人でやっても、疑似マルチスレッドできるけどw


ちなみに、だるまさんがころんだは、鬼がクロックジェネレータだと思うとよいでしょうw

スピードは、実際にマルチスレッドでプログラムコード書いてみると、わかるっすよw
#書くの面倒だからおいらはやらないけどww

メッセージの処理とかも同じように実体験から学ぶことはできるんですけどねw
こっちは、まぁネタでもあるのでとりあえず保留...w

# プログラマーと名乗りにくいのはなんなんだ 2007/07/20 11:15 Ognacの雑感

プログラマーと名乗りにくいのはなんなんだ

# re: なんともタイトルをつけにくいある日の出来事 2007/07/20 11:47 じゃんぬねっと

> 余談だが、KもHも俺より年上である

私やシャノンさんの年代だとほとんどが年上。
後輩すら年上。部下すら年上。やりにくい。

とりあえず、猫プロの SDK 絡みだけでも見てもらった方が手を煩わせずに済むかも。

タイトル
名前
Url
コメント