タイマーイベントの終了を感知するには?

解決


おめでとうございます。  2006-01-05 19:17:45  No: 19488  IP: 192.*.*.*

タイマーイベントで時間のかかる処理をし、ユーザーがフォームを閉じようとする場合、タイマーイベントの終了をまってから閉じる方法を知りたいのです。
よろしくお願いします。

procedure TForm.Timer1Timer(Sender: TObject);
begin
  http.Get(Url);//ここの時間がかかる処理
end;

procedure TForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //こんな感じで感知できるとありがたいのです。
  while Timer1.Busy do;
  Action := caFree;
end;

編集 削除
わからんちん  2006-01-05 19:37:54  No: 19489  IP: 192.*.*.*

タイマー・ルーチン
フラグ・セット
  処理
フラグ、リセット

タイマー起動
アプリの終了イベントがきたら、フラグをチェックコクンド発行
フラグが立っていなかったら終了
フラグが立っていたら、終了しない

・・・こんな感じでしょうか。

ワンショットかリピートか、あるいは、別のタイマで監視する手も
あるかも知れません。自分は、各コンポにはTag があるので
それを利用しています。

編集 削除
わからんちん  2006-01-05 19:39:13  No: 19490  IP: 192.*.*.*

コクンド発行  --> コマンド発行

編集 削除
ん?  2006-01-05 19:48:51  No: 19491  IP: 192.*.*.*

使ったことないのでわからないのですが、

> http.Get(Url);//ここの時間がかかる処理
この時間のかかる処理で、httpが「読み込み中(Get)である」という状態は、
取得できないのでしょうか?
あるなら、それで判断するだけでいいような気がしますが。

Httpだけに、内部的に別スレッドで読み込み処理を行っていると想像しますが、
その状態ぐらい拾えないと、例えばブラウザの読み込み中の表示や、プログレスバーの表示切り替え等
行うことができないように思われます。

編集 削除
おめでとうございます。  2006-01-05 19:49:29  No: 19492  IP: 192.*.*.*

わからんちんさん解答ありがとうございます。
Tagを利用する方法は、終了段階のループ中に変化しないのですが、何か方法があるのでしょうか?

procedure TForm.Timer1Timer(Sender: TObject);
begin
Timer1.Tag = 1;
http.Get(Url);//ここの時間がかかる処理
Timer1.Tag = 0;
end;

procedure TForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
while Timer1.Tag = 1 do;
Action := caFree;
end;

編集 削除
わからんちん  2006-01-05 20:00:16  No: 19493  IP: 192.*.*.*

これでダメでしょうか?

procedure TForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Timer1.Tag = 0 then Close  else Exit;
end;

編集 削除
おめでとうございます。  2006-01-05 20:02:51  No: 19494  IP: 192.*.*.*

ん?さん、返事ありがとうございます。
実はあのhttpはTIdHTTPなのですが、TIdHTTP:Connectedプロパティをループに入れたらやっぱり変化しないようなのです。
私の環境だけでしょうか?(-_;)
Delphi7 Indy9

編集 削除
おめでとうございます。  2006-01-05 20:11:45  No: 19495  IP: 192.*.*.*

わからんちんさん度々ありがとうございます。
提示していただいた
if Timer1.Tag = 0 then Close  else Exit;  ですね。
確かに安全に終了できますが、ユーザーに再度閉じるボタンを押させたくはないのです。FormCloseの中だけで処理したいのですが無理ですかね…?
半日これでつぶしてます。

編集 削除
わからんちん  2006-01-05 20:50:46  No: 19496  IP: 192.*.*.*

あまりスマートでないですが、とりあえず・・・。

if Timer1.Tag = 0 then Close  else 終了タイマ起動


プロシジャ  終了タイマ
    もし、処理中フラグが立ったままなら
    再度終了タイマをコール
    そうでなければ終了
エンド

編集 削除
おめでとうございます。  2006-01-05 20:58:47  No: 19497  IP: 192.*.*.*

解決しました。
これで古畑を見れます。
これもそれもヒントを与えてくださったおかげです。
わからんちんさんのフラグの方法とん?さんのhttpの終了を待つ方法の双方のアドバイスが役に立ちました。
ありがとうございます。
短いコードなので説明割愛させていただきます。

var
  CloseQuery: boolean = false;
  
procedure TForm.Timer1Timer(Sender: TObject);
begin
  http.Get(Url);//ここの時間がかかる処理
end;

procedure TForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  CloseQuery := true;
  if http.Connected then exit;
  Action := caFree;
end;

procedure http.IdHTTP2Disconnected(Sender: TObject);
begin
  if CloseQuery then Close;
end;

編集 削除