CWinApp::OnIdle(LONG lCount)について

解決


うーん  2009-03-09 14:36:26  No: 69811  IP: [192.*.*.*]

お世話になります。

MSDNでMFCのCWinApp::OnIdle(LONG lCount)の解説を見ると、

lCount について

アプリケーションのメッセージ キューが空のときに、OnIdle が呼び出され
るたびに増分されるカウンタ。このカウンタは、新しいメッセージが処理さ
れるたびに 0 にリセットされます。

これを見ると、ICountの値がOnIdle関数内で変化して呼び出し側に反映され
るように読み取れます。しかし、引数を見ると、値コピーであり、LONGはポ
インタでもないし、参照が使われているわけでもありません。

MSDNの解説は、Onidle(Icount++)のようにユーザがICountの値を増分し、
新しいメッセージが処理されるたびに0にセットしろ!という意味で
しょうか?

編集 削除
 2009-03-09 14:56:44  No: 69812  IP: [192.*.*.*]

読み間違い

編集 削除
aetos  2009-03-09 15:38:11  No: 69813  IP: [192.*.*.*]

> MSDNの解説は、Onidle(Icount++)のようにユーザがICountの値を増分し、
> 新しいメッセージが処理されるたびに0にセットしろ!という意味で
> しょうか?

ちゃいます。
フレームワークがインクリメントします。
簡単かつ大雑把に言うと、OnIdle から TRUE を返した回数が渡されます。

編集 削除
うーん  2009-03-09 16:54:52  No: 69814  IP: [192.*.*.*]

>OnIdle から TRUE を返した回数が渡されます。
ICountを通してでしょうか?

でも、C++いやC言語の場合、値コピーでは関数内で値を変更
した結果を引数を通して呼び出し側に返すことはできないです
よね?

返すことができるのは参照かポインタを使った場合だけと理解
してますが。

それともVC++では値渡しの場合でも関数内の値の変更が呼ぶ出し
側に反映されるんでしょうか?そこがわからないのです。

編集 削除
επιστημη  URL  2009-03-09 17:06:12  No: 69815  IP: [192.*.*.*]

>>OnIdle から TRUE を返した回数が渡されます。
> ICountを通してでしょうか?

戻り値ぢゃねぇの?

編集 削除
うーん  2009-03-09 17:15:40  No: 69816  IP: [192.*.*.*]

戻り値ぢゃねぇの?

BOOL型を返すことになっているんですが。

そりゃあ、マイクロソフトの勝手な規則ではBOOLの実体は4byte
の整数だから、それで回数を返すことも可能なんでしょうけど、
これが本当ならつくづく変わった仕様だと思いますね。

編集 削除
επιστημη  URL  2009-03-09 17:28:57  No: 69817  IP: [192.*.*.*]

だーかーらー

呼び出し側でたとえば

if ( OnIdle(lCount) ) {
  ++lCount;
} else {
  lCount = 0;
}

とかやってんじゃないの?

編集 削除
うーん  2009-03-09 18:26:18  No: 69818  IP: [192.*.*.*]

関数の戻り値は使っているものの、結局、呼び出し側でOnidleの値を
変更しているじゃないですか?

それなら、最初の質問で聞いたOnidle(Icount++)のようにユーザが
ICountの値を増分し、新しいメッセージが処理されるたびに0にセット
しろ!という意味と同じじゃないですか?

どうもかみあわない。

編集 削除
 2009-03-09 18:56:31  No: 69819  IP: [192.*.*.*]

呼び出されるのである。
呼び出す方は既にある。コードを書くのは呼び出される方。

編集 削除
うーん  2009-03-09 19:05:22  No: 69820  IP: [192.*.*.*]

↑何言ってるかさっぱりわからん。謎めいたこと言うだけなら黙ってろ。

もう見ない。せいぜい書いてくれや

編集 削除
 2009-03-09 19:14:10  No: 69821  IP: [192.*.*.*]

ユーザーは呼び出すコードを書かないから
そういう説明なんだよ

編集 削除
 2009-03-09 19:22:46  No: 69822  IP: [192.*.*.*]

もしかして
呼び出して使うと思ってたのか?
呼ぶから派生クラスで中のコード書けってこと

編集 削除
 2009-03-09 19:31:10  No: 69823  IP: [192.*.*.*]

プログラマーが書くのはOnIdleの中身。
呼び出すコードは既にフレームワークに用意されており
プログラマーは書かない。だから受動的説明ね

編集 削除
 2009-03-09 19:34:48  No: 69824  IP: [192.*.*.*]

あほですか?

編集 削除
 2009-03-09 19:37:32  No: 69825  IP: [192.*.*.*]

説明が下手ですみません

編集 削除
 2009-03-09 20:07:33  No: 69826  IP: [192.*.*.*]

おまえが理解できねえからって

編集 削除
wclrp ( 'o')  2009-03-09 20:23:30  No: 69827  IP: [192.*.*.*]

お前が勝手に呼び出して使うものだと思い込んでいるだけなのに
回答を悪者にするなよ。

> それなら、最初の質問で聞いたOnidle(Icount++)のようにユーザが
> ICountの値を増分し、新しいメッセージが処理されるたびに0にセット
> しろ!という意味と同じじゃないですか?

MSDNに
> OnIdle 関数が呼び出されます。
って書いてあるだろ。

Onidleを呼び出すのはユーザでもプログラマでもないんだから
0にセットしろなんて命令形で説明しないんだよ。

編集 削除
rin  2009-03-09 21:06:19  No: 69828  IP: [192.*.*.*]

マウス動作や、クリックで呼ばれるオーバーライド関数と同じで
 lCountは、上位から値が入った状態で呼ばれる
MSDNでOnIdleの例をみればわかるが、 lCountは変更してない。

つまり、
アプリ開発者は、OnIdleの中にて
上位から渡されたlCountの値にあわせてやりたい動作を記述するだけ。
(何か動作したら、TRUEを返す。)
というわけで、lCountの値を変更する必要はない。

MSDNに
>最後に、OnIdle はすべてのアイドル タスクの処理を終了し、0 を返します。
とあるが、この0はlCountとは関係なく、BOOL値の0。つまりFALSEのこと

なお、OnIdleの上位が何やってるか知りたければ
ブレークをはり、中でとめ、呼び出し履歴をつかえば、
CWinThread::Run()の中から呼び出してるってことがわかる。

編集 削除
うーん  2009-03-10 09:24:40  No: 69829  IP: [192.*.*.*]

分からなくてイライラし、失礼な言をいったことをお詫びします。

引数からデータを受け取って関数内で処理をし、結果を関数の戻り
値か、引数を通して結果を返すのが関数の基本と考えていました。

しかし、OnLButtonDownなどのイベントハンドラは、MFCのメイン
フレームから呼び出され、その際、マウス座標を値コピーで受け取り
ます。そして、プログラマはこのマウス座標を使っていろいろな処理
をコーディングします。

この場合、プログラマに陽に公開されているのは呼び出されるイベント
ハンドラであり、呼び出すメインフレーム側ではありません。

Onidleもこのような使い方をするのだと気づいてやっと理解できました。

編集 削除
 2009-03-10 09:39:08  No: 69830  IP: [192.*.*.*]

根本的に呼び出されると呼び出すを間違えてるくせに
自分が正しくて他が変だとか、からかわれてるとでも思ったか。
思い込みで捨て台詞

編集 削除