よろしくお願いします。
Timerが二つあり、関数が一つあります。(同じクラス内)
それぞれのTimerからこの関数へアクセスするのですが、同時にアクセスしてしまった問題ありますよね?
よくわからないのですが、関数を違うクラスにしといて、Timer1とTimer2がそれぞれ違うアクセスでこの関数を使用すれば問題ないのでしょうか?
まったくもって同時は普通に組んでいればあり得ませんのでご心配なく。
関数の中にグローバル変数があった場合、
予期しない動作になったりしませんか?
monaaさん回答ありがとうございます。
まったく同時でなければ大丈夫であり、同時はありえないということですね。
わかりました。
さらにそれに関連して質問があるのですが。
Timer1とTimer2があり、それぞれでTimeout処理を作りたいと思っています。
TimeOut処理は「TimerTimeout」とし、現在はTimer1TimeoutとTimer2TiemOutを作っています。
しかしTimer1TimeoutとTimer2Timeoutの処理はまったく同じなので(中身の変数などは違う)、Timer1とTimer2でTimerTimeoutを同じものを使用したいと考えています。さきほどの質問の関数とは違うので、どうすればよいかわかりません。
よろしくお願いします。
deldelさん
関数の中はグローバル変数を使用せず、ローカル変数のみです。
たとえば
procedure GetHoge();
begin
Memo1.lines.add(GettickCount());
end;
みたいに現在時間をメモに出力する関数があるとして
それを複数スレッドから呼び出しても、Memo1に書き込まれる時刻は
整然と並ぶってことです。
より厳密にクロック数を出力させれば、まったく同じ値を取らず順序良く並びます。
タイムアウト処理を同じにしたいのであれば
procedure TimeOut();
という関数を用意してタイムアウト時に呼び出せば済む話のような気がします。
あと、よく言う同時アクセスってのは
ファイルを開く関数を実行し、ファイルを閉じる前に同じ関数が実行されたとき、二番目に実行された関数内でファイルが開けないといった動作をさすことが多いですが、これは厳密には”関数の”同時アクセスではありません。
ツイート | ![]() |