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

解決


うーん  2009-03-09 23:36:26  No: 69811

お世話になります。

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

lCount について

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

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

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


  2009-03-09 23:56:44  No: 69812

読み間違い


aetos  2009-03-10 00:38:11  No: 69813

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

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


うーん  2009-03-10 01:54:52  No: 69814

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

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

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

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


επιστημη  URL  2009-03-10 02:06:12  No: 69815

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

戻り値ぢゃねぇの?


うーん  2009-03-10 02:15:40  No: 69816

戻り値ぢゃねぇの?

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

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


επιστημη  URL  2009-03-10 02:28:57  No: 69817

だーかーらー

呼び出し側でたとえば

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

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


うーん  2009-03-10 03:26:18  No: 69818

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

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

どうもかみあわない。


  2009-03-10 03:56:31  No: 69819

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


うーん  2009-03-10 04:05:22  No: 69820

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

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


  2009-03-10 04:14:10  No: 69821

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


  2009-03-10 04:22:46  No: 69822

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


  2009-03-10 04:31:10  No: 69823

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


  2009-03-10 04:34:48  No: 69824

あほですか?


  2009-03-10 04:37:32  No: 69825

説明が下手ですみません


  2009-03-10 05:07:33  No: 69826

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


wclrp ( 'o')  2009-03-10 05:23:30  No: 69827

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

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

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

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


rin  2009-03-10 06:06:19  No: 69828

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

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

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

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


うーん  2009-03-10 18:24:40  No: 69829

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

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

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

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

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


  2009-03-10 18:39:08  No: 69830

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加