二つのTimerから関数へアクセスした場合について


PEN  2009-05-13 18:49:51  No: 34378

よろしくお願いします。
Timerが二つあり、関数が一つあります。(同じクラス内)
それぞれのTimerからこの関数へアクセスするのですが、同時にアクセスしてしまった問題ありますよね?

よくわからないのですが、関数を違うクラスにしといて、Timer1とTimer2がそれぞれ違うアクセスでこの関数を使用すれば問題ないのでしょうか?


monaa  2009-05-13 19:39:21  No: 34379

まったくもって同時は普通に組んでいればあり得ませんのでご心配なく。


deldel  2009-05-13 19:56:15  No: 34380

関数の中にグローバル変数があった場合、
予期しない動作になったりしませんか?


PEN  2009-05-13 20:07:01  No: 34381

monaaさん回答ありがとうございます。
まったく同時でなければ大丈夫であり、同時はありえないということですね。
わかりました。

さらにそれに関連して質問があるのですが。
Timer1とTimer2があり、それぞれでTimeout処理を作りたいと思っています。
TimeOut処理は「TimerTimeout」とし、現在はTimer1TimeoutとTimer2TiemOutを作っています。
しかしTimer1TimeoutとTimer2Timeoutの処理はまったく同じなので(中身の変数などは違う)、Timer1とTimer2でTimerTimeoutを同じものを使用したいと考えています。さきほどの質問の関数とは違うので、どうすればよいかわかりません。
よろしくお願いします。


PEN  2009-05-13 20:08:57  No: 34382

deldelさん

関数の中はグローバル変数を使用せず、ローカル変数のみです。


monaa  2009-05-13 22:00:10  No: 34383

たとえば
procedure GetHoge();
begin
  Memo1.lines.add(GettickCount());
end;
みたいに現在時間をメモに出力する関数があるとして
それを複数スレッドから呼び出しても、Memo1に書き込まれる時刻は
整然と並ぶってことです。
より厳密にクロック数を出力させれば、まったく同じ値を取らず順序良く並びます。


monaa  2009-05-13 22:06:36  No: 34384

タイムアウト処理を同じにしたいのであれば
procedure TimeOut();
という関数を用意してタイムアウト時に呼び出せば済む話のような気がします。
あと、よく言う同時アクセスってのは
ファイルを開く関数を実行し、ファイルを閉じる前に同じ関数が実行されたとき、二番目に実行された関数内でファイルが開けないといった動作をさすことが多いですが、これは厳密には”関数の”同時アクセスではありません。


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

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






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