- ベストアンサー
OSとアプリとユーザの関係教えてください。
プログラミングをしていて気になったのですが、ボタンのダブルクリックしてそこに命令文をちょろちょろと書けば、ボタンがクリックされたときにその命令が実行されますが、これってどのような仕組みなのでしょうか? ユーザとOSとそのアプリの関係を教えてください。 自分なりに調べてこうかなーと思うのは、以下のとおりです。 ユーザがボタンをマウスでクリック ->OS(Windows)がそれを理解して? ->アプリに伝える ->アプリはボタンがクリックされたときのイベントのところをみにいってそこにかかれている命令文を実行する WM(ウインドウメッセージ)がどこの段階でどこからどこへ投げられているのかいまいちよくわかりませんでした。 ボタンが押されてから、イベント処理がなされるまでの詳細な流れ(メッセージのやり取りや受け手の処理)を是非、教えていただけないでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
1.OSが起動されて、マウスのデバイスドライバを組み込む。 2.マウスのデバイスドライバがデバイスの初期化をする時に「マウスから何かデータが来た時に起こるハードウエア割り込みは、ここで処理する」と設定する。 3.アプリが立ち上がり「メッセージループ」と呼ばれる処理ルーチンがOSに登録される。 4.OSは「Windowsの終了」が行われるまでの間「アイドル状態」になり、「アイドル状態」の時は、OSに登録されているメッセージループを実行優先度に従って順々に呼び出していく。また、呼び出したメッセージループの処理が重い(なかなか戻って来ない)と他のアプリが動けなくなるので、システムタイマーを使って定期的にタイマー割り込みを起こし、他のアプリに制御を移す事もある。 5.マウスが動かされたりボタンが押されると、ハードウエア割り込みが起こり、マウス用のデバイスドライバの中に飛んで行く。 6.マウスのデバイスドライバが、マウス変化のウインドウメッセージをメッセージキューに放り込むようにOSに要求する。 7.マウス変化のウインドウメッセージをメッセージキューに放り込むように要求されたOSは、そのメッセージがどのアプリ宛かを調べた上(マウスカーソルがどのウィンドウの上にあったかで調べる)、宛先アプリの情報を付加したウインドウメッセージをメッセージキューに入れ、マウスの割り込み処理ルーチンに戻る。 8.マウスの割り込み処理が終り、マウスのデバイスドライバから元のプログラム(つまりは、アプリのメッセージループ)に戻る。 9.アプリのメッセージループは、自分宛のウインドウメッセージがメッセージキューに無いか調べる。あったら、そのメッセージを取り出し、メッセージごとの処理に振り分ける。(画面の再描画だとか、マウスボタンが押されただとか) 10.マウスボタンが押された時に呼ばれる処理で、ボタンとかメニューとか、何の上でボタンが押されたか判定する。それがボタンコントロールの上だったら、そのボタンコントロールに登録されている、クリックイベントのルーチンを呼ぶ。 11.プログラマーが書いた、クリックイベントのルーチンが実行される。 12.イベント処理が終ったら、アプリのメッセージループに戻って来る。アプリはイベントの処理結果(ウィンドウメッセージを取り出した結果)をOSに返す。 13.OSは、イベントの処理結果に応じて、後処理を行う。例えば、処理済みのウィンドウメッセージをメッセージキューから消す、など。 14.「4.」のアプリの切り替え処理に戻り、延々と繰り返す。 なお「7.」の処理で、メッセージ内容が「マウスボタンが押された」だった場合で、かつ、宛先アプリがアクティブになってない場合は、マウスボタンを押したメッセージをキューに入れる前に、アクティブメッセージや再描画メッセージもキューに入れます。これにより「マウスで押したら画面がアクティブになる」と言う処理が行われます。
その他の回答 (1)
ある程度の知識はおありのようですね。 おそらくは「投げる」という言葉が使われているせいで、混乱されているだけでしょう。 イベント情報(マウスがクリックされたとか)を認識するのはOSです。 このとき、アプリケーションは「OSの機能を使って」ウィンドウなどを記述しています。 なので、OSは「今どの座標にどのアプリのウィンドウがあるか」という情報を全て持っているのです。 OSがイベント情報を解釈し、現在アクティブになっているウィンドウの座標情報などから、「どのウィンドウのところでマウスがクリックされたか」などを認識し、「そのウィンドウを保持しているアプリケーション」にイベント情報を送信します。 このとき、「規定の方法で作成されたルーチンを、OSが直に起動する」という方法によってイベント情報を受け渡ししています。 よって、ウィンドウズの規定に従っていないルーチンには、OSはイベント情報を「投げる」ことはできないのです。 ウィンドウメッセージは、その「規定の方法で作られたルーチン」に対し、引数として渡されています。
お礼
回答ありがとうございます。 OSとアプリとユーザの関係がよくわかりました。
お礼
自分の期待していた以上のお答えありがとうございます。 細かく、わかりやすく書かれていて、自分の理解を深めることができました。