例えば、
関数Waitでフラグ1がたつのを待っているとします。
このフラグ1を待っている間は関数Waitで永久待ちしているとして、
ボタン操作などでこの関数Waitを呼び出したとします。
そしたら、もともとフラグ1を待ち状態のWait関数とボタン操作で呼ばれたWait関数の関係性はどうなるのでしょうか?
最初のWiat関数が終わるまでボタン操作で呼び出された関数は実行しない?
プログラムの処理がどうなるのか教えてください。
関数は全てメモリー内で展開されますので、
再帰のような関数の中から同じ関数を呼び出すときそれは
全く別物として再生されます。
もちろんフラグがグローバル変数ならフラグ自体は同じメモリを参照します。
>このフラグ1を待っている間は関数Waitで永久待ちしているとして、
>ボタン操作などでこの関数Waitを呼び出したとします。
Wait 実行中にボタンを押して、再び Wait を呼び出す、ということは
関数 Wait の中にメッセージ処理をする部分があって、「ボタンを押す」と
いうイベントを処理してイベントハンドラが呼び出され、そのなかで
Wait を呼び出す、ということになりますね。
これは、あいだにメッセージ処理を挟んでいる、ということを除けば、関数から
同じ関数を呼び出す再帰処理と同じです。 フラグがグローバル変数なら
フラグがたった時点で、二度目の Wait から復帰して最初によびだした
メッセージループから復帰し、最初に実行されていた Wait も復帰し・・・
という実行経路をたどります。
回答ありがとうございます。
グローバル変数をフラグ1以外にも使用していて、同じメモリを参照する変数や関数があって、これらに同時にアクセスした場合はどうなるのでしょうか?
ツッコまれそうな事を書きますが
プログラムが動作するというのは、カセットテープを再生するようなもので、再生されている場所というのは厳密に1点のみです。
だから一見同時に思える処理も必ず順番がありますので、
同時にアクセスというのはそもそも起こりえません。
var a:integerにa:=1,a:=2を同時に行ったつもりでも、結果はa=1かa=2になり、後に行われた処理が最後に残ります。
正直どんな問題に遭遇してそのような疑問が湧いたのかが想像できません。
Application.ProcessMessagesが理解を複雑化させてるのかな?
だとするとWindowsアプリケーションのメッセージループから理解する必要が
あるので、それはそれで調べてみてください。
えーと、そもそもTUNさんはApplication.ProcessMessageなどを使っているのでしょうか?
元の質問では単に「永久待ち」としか言っていないので、文字通り永久にループしているだけかと思ったのですが。
procedure Wait;
begin
repeat until flag1;
end;
こういう状態だとしたら、イベント処理が実行されないので
関数から抜けるまでボタンを押せません。(押しても何も起こりません)
一応、マウスイベントはメッセージキューに溜まりますから
> 最初のWiat関数が終わるまでボタン操作で呼び出された関数は実行しない
が正解ということになりますね。
Application.ProcessMessageまたはスレッド処理のつもりで考えていました。
この辺は初心者なので、よくわからないのですが、
スレッドの場合は関数処理はマルチに動く?という認識でよいのでしょうか?
Application.ProcessMessage は
ここで他のプログラムも割り込んで仕事して下さい。
スレッドは別の部屋でお仕事してる。
で他の部屋で仕事で本を読んでる人の本を読もうとすると
Synchronizeを使って空いた時間に私も読ませてね。
って感じですかね。
TUNさんの最初の関数Waitでフラグ1がたつのを待っているとします。
は別スレッドを立てて定期的にWaitを変えるプログラムを見張れば
できると言う事になります。
ツイート | ![]() |