お世話になります。
MSDNでMFCのCWinApp::OnIdle(LONG lCount)の解説を見ると、
lCount について
アプリケーションのメッセージ キューが空のときに、OnIdle が呼び出され
るたびに増分されるカウンタ。このカウンタは、新しいメッセージが処理さ
れるたびに 0 にリセットされます。
これを見ると、ICountの値がOnIdle関数内で変化して呼び出し側に反映され
るように読み取れます。しかし、引数を見ると、値コピーであり、LONGはポ
インタでもないし、参照が使われているわけでもありません。
MSDNの解説は、Onidle(Icount++)のようにユーザがICountの値を増分し、
新しいメッセージが処理されるたびに0にセットしろ!という意味で
しょうか?
読み間違い
> MSDNの解説は、Onidle(Icount++)のようにユーザがICountの値を増分し、
> 新しいメッセージが処理されるたびに0にセットしろ!という意味で
> しょうか?
ちゃいます。
フレームワークがインクリメントします。
簡単かつ大雑把に言うと、OnIdle から TRUE を返した回数が渡されます。
>OnIdle から TRUE を返した回数が渡されます。
ICountを通してでしょうか?
でも、C++いやC言語の場合、値コピーでは関数内で値を変更
した結果を引数を通して呼び出し側に返すことはできないです
よね?
返すことができるのは参照かポインタを使った場合だけと理解
してますが。
それともVC++では値渡しの場合でも関数内の値の変更が呼ぶ出し
側に反映されるんでしょうか?そこがわからないのです。
>>OnIdle から TRUE を返した回数が渡されます。
> ICountを通してでしょうか?
戻り値ぢゃねぇの?
戻り値ぢゃねぇの?
BOOL型を返すことになっているんですが。
そりゃあ、マイクロソフトの勝手な規則ではBOOLの実体は4byte
の整数だから、それで回数を返すことも可能なんでしょうけど、
これが本当ならつくづく変わった仕様だと思いますね。
だーかーらー
呼び出し側でたとえば
if ( OnIdle(lCount) ) {
++lCount;
} else {
lCount = 0;
}
とかやってんじゃないの?
関数の戻り値は使っているものの、結局、呼び出し側でOnidleの値を
変更しているじゃないですか?
それなら、最初の質問で聞いたOnidle(Icount++)のようにユーザが
ICountの値を増分し、新しいメッセージが処理されるたびに0にセット
しろ!という意味と同じじゃないですか?
どうもかみあわない。
呼び出されるのである。
呼び出す方は既にある。コードを書くのは呼び出される方。
↑何言ってるかさっぱりわからん。謎めいたこと言うだけなら黙ってろ。
もう見ない。せいぜい書いてくれや
ユーザーは呼び出すコードを書かないから
そういう説明なんだよ
もしかして
呼び出して使うと思ってたのか?
呼ぶから派生クラスで中のコード書けってこと
プログラマーが書くのはOnIdleの中身。
呼び出すコードは既にフレームワークに用意されており
プログラマーは書かない。だから受動的説明ね
あほですか?
説明が下手ですみません
おまえが理解できねえからって
お前が勝手に呼び出して使うものだと思い込んでいるだけなのに
回答を悪者にするなよ。
> それなら、最初の質問で聞いたOnidle(Icount++)のようにユーザが
> ICountの値を増分し、新しいメッセージが処理されるたびに0にセット
> しろ!という意味と同じじゃないですか?
MSDNに
> OnIdle 関数が呼び出されます。
って書いてあるだろ。
Onidleを呼び出すのはユーザでもプログラマでもないんだから
0にセットしろなんて命令形で説明しないんだよ。
マウス動作や、クリックで呼ばれるオーバーライド関数と同じで
lCountは、上位から値が入った状態で呼ばれる
MSDNでOnIdleの例をみればわかるが、 lCountは変更してない。
つまり、
アプリ開発者は、OnIdleの中にて
上位から渡されたlCountの値にあわせてやりたい動作を記述するだけ。
(何か動作したら、TRUEを返す。)
というわけで、lCountの値を変更する必要はない。
MSDNに
>最後に、OnIdle はすべてのアイドル タスクの処理を終了し、0 を返します。
とあるが、この0はlCountとは関係なく、BOOL値の0。つまりFALSEのこと
なお、OnIdleの上位が何やってるか知りたければ
ブレークをはり、中でとめ、呼び出し履歴をつかえば、
CWinThread::Run()の中から呼び出してるってことがわかる。
分からなくてイライラし、失礼な言をいったことをお詫びします。
引数からデータを受け取って関数内で処理をし、結果を関数の戻り
値か、引数を通して結果を返すのが関数の基本と考えていました。
しかし、OnLButtonDownなどのイベントハンドラは、MFCのメイン
フレームから呼び出され、その際、マウス座標を値コピーで受け取り
ます。そして、プログラマはこのマウス座標を使っていろいろな処理
をコーディングします。
この場合、プログラマに陽に公開されているのは呼び出されるイベント
ハンドラであり、呼び出すメインフレーム側ではありません。
Onidleもこのような使い方をするのだと気づいてやっと理解できました。
根本的に呼び出されると呼び出すを間違えてるくせに
自分が正しくて他が変だとか、からかわれてるとでも思ったか。
思い込みで捨て台詞
ツイート | ![]() |