タイマーイベントで時間のかかる処理をし、ユーザーがフォームを閉じようとする場合、タイマーイベントの終了をまってから閉じる方法を知りたいのです。
よろしくお願いします。
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;
タイマー・ルーチン
フラグ・セット
処理
フラグ、リセット
タイマー起動
アプリの終了イベントがきたら、フラグをチェックコクンド発行
フラグが立っていなかったら終了
フラグが立っていたら、終了しない
・・・こんな感じでしょうか。
ワンショットかリピートか、あるいは、別のタイマで監視する手も
あるかも知れません。自分は、各コンポにはTag があるので
それを利用しています。
コクンド発行 --> コマンド発行
編集 削除使ったことないのでわからないのですが、
> http.Get(Url);//ここの時間がかかる処理
この時間のかかる処理で、httpが「読み込み中(Get)である」という状態は、
取得できないのでしょうか?
あるなら、それで判断するだけでいいような気がしますが。
Httpだけに、内部的に別スレッドで読み込み処理を行っていると想像しますが、
その状態ぐらい拾えないと、例えばブラウザの読み込み中の表示や、プログレスバーの表示切り替え等
行うことができないように思われます。
わからんちんさん解答ありがとうございます。
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;
これでダメでしょうか?
procedure TForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Timer1.Tag = 0 then Close else Exit;
end;
ん?さん、返事ありがとうございます。
実はあのhttpはTIdHTTPなのですが、TIdHTTP:Connectedプロパティをループに入れたらやっぱり変化しないようなのです。
私の環境だけでしょうか?(-_;)
Delphi7 Indy9
わからんちんさん度々ありがとうございます。
提示していただいた
if Timer1.Tag = 0 then Close else Exit; ですね。
確かに安全に終了できますが、ユーザーに再度閉じるボタンを押させたくはないのです。FormCloseの中だけで処理したいのですが無理ですかね…?
半日これでつぶしてます。
あまりスマートでないですが、とりあえず・・・。
if Timer1.Tag = 0 then Close else 終了タイマ起動
プロシジャ 終了タイマ
もし、処理中フラグが立ったままなら
再度終了タイマをコール
そうでなければ終了
エンド
解決しました。
これで古畑を見れます。
これもそれもヒントを与えてくださったおかげです。
わからんちんさんのフラグの方法とん?さんの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;