Discussion:
Windowsディスパッチのタイミング
(too old to reply)
C#Sharp.com
2005-09-12 02:38:06 UTC
Permalink
いつもお世話になります。
ウィンドウプロシージャー、イベントハンドラ、Thread等についてお聞きしたく投稿しました。

イベントハンドラ(ボタン)実行中に、Timerコンポーネントのハンドラが割り込む可能性はあるのでしょうか?
必ず、イベントハンドラ(ボタン)関数が終了してから、Timerコンポーネントのハンドラが実行されるのでしょうか?

又、ウィンドウプロシージャー、Thread等も同様と考えてよろしいでしょうか?
同じでしょうか?

ディスパッチのタイミングがわかりません。
ハードウエア割り込みと同じ取り扱いのすべきスレッド、ハンドラはあるのでしょうか?

ご教示よろしくお願いします。

以上
tamatama
2005-09-12 04:21:20 UTC
Permalink
Post by C#Sharp.com
イベントハンドラ(ボタン)実行中に、Timerコンポーネントのハンドラが割り込む可能性はあるのでしょうか?
必ず、イベントハンドラ(ボタン)関数が終了してから、Timerコンポーネントのハンドラが実行されるのでしょうか?
Application.DoEvent( )をボタンのイベントハンドラ内で呼んだときには、Timerコンポーネントのハンドラに処理を渡します。
ボタンのイベントハンドラの記述次第ではTmerコンポーネントがメッセージを受け取れるので、
実行する可能性があり、必ず終了してとは言い切れません。
また、同様に、GUIのハンドリングの高速化のために、Application.DoEventのようなメソッドが挿入されていても不思議はありませんので
条件が限定されない限りは、あるという答えになるかと思います。

(ウィンドウプロシージャーではメッセージを受けて処理をするので、メッセージが取れる条件がそろえば
 実行することが基本なので、割り込むという表現とは、やや異なります。)
Post by C#Sharp.com
又、ウィンドウプロシージャー、Thread等も同様と考えてよろしいでしょうか?
同じでしょうか?
ウィンドウプロシージャーは、基本的にメッセージによるイベント処理が中心であり、

Threadとは概念が異なるので、同様とは考えることができないと思います。
例.ウィンドウプロシージャーの処理をThreadで行うという場合には、
  Threadが実行権を獲得してウィンドウプロシージャーの処理を実行する
Post by C#Sharp.com
ハードウエア割り込みと同じ取り扱いのすべきスレッド、ハンドラはあるのでしょうか?
複数のスレッドが実行して、振る舞いがおかしいというのであれば、
( ハードウエア割り込みと同じ取り扱いとは、複数のスレッドが同じリソースを扱うと拡大解釈しました)

Lockステートメントあたりを参考にしてはいかがでしょうか?

あるいは

System.Threading.Mutex

も参考になるのでは…
C#Sharp.com
2005-09-14 01:31:02 UTC
Permalink
お世話になります。
すみません。いままで、調べていましたが、下記不明です。
Application.DoEvent( )とは何でしょうか?
以上
tamatama
2005-09-14 01:44:16 UTC
Permalink
Post by C#Sharp.com
Application.DoEvent( )とは何でしょうか?
下記URLを参照してみてください。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformsapplicationclassdoeventstopic.asp
Takeshi SHIGIHARA
2005-09-14 01:59:23 UTC
Permalink
Post by C#Sharp.com
Application.DoEvent( )とは何でしょうか?
探し方がヘタなのか英語のしか見つからない。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformsapplicationclassdoeventstopic.asp?frame=true&hidetoc=true

日本語のほうは、Visual Studioに付属の MSDN などで DoEvents を
探してみてください。

これは、おおよそ以下の処理を行うものです。
*各々の関数は Win32 API です。
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

つまり、なんらかのメッセージが待機状態ならば、そのメッセージを
強制的に処理させる、というものです。
MSDNの説明にもありますが、DoEventsを発行する場合には、ボタンの
再入の処理などに特に注意してください。

これは、よく、長い時間を要する処理の間にDoEventsを埋め込んで、
ときおり画面の再表示をさせたり、他のボタンを押せる状態を作ったり
するために使用されます。
もっとも、可能ならThreadを使うようにしたほうがボタン2度押しやら
の問題に悩まされなくて済むことでしょう。


----- Takeshi SHIGIHARA
***@tka.att.ne.jp
***@po.jah.ne.jp -----
うまい、早い、安い/2つだけ選べ--RFC1925.
C#Sharp.com
2005-09-21 05:17:01 UTC
Permalink
皆さん、有り難うございました。

以上

Loading...