TTimerでのKillTimerの使い方の疑問
TTimerコンポーネントのKillTimer戻りがFalseを吐くので調べてみました
GetLastError値は$00000000で内容は「この操作を正しく終了しました。」
推定原因
1. KillTimerの多重呼出
2.Application.MainForm.Visibleの前の呼び出し
3.Application.Terminated時の不完全な呼び出し
解決案
TTimer = class(TComponent)
private
FEnabled: Boolean;
FTimerOn: Boolean;//追加(多重呼出禁止の為)
-----------------------------------------------------------
constructor TTimer.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTimerOn := False;//追加
FEnabled := True;
FInterval := 1000;
-----------------------------------------------------------
procedure TTimer.UpdateTimer;//変更
begin
if ((Application.MainForm <> nil) and (FInterval <> 0) and
(not FEnabled) and (Application.MainForm.Visible)) or
(Application.Terminated) then
begin
if FTimerOn then
if KillTimer(FWindowHandle, 1) then
FTimerOn := False;
FEnabled := False;
end;
if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then
if not FTimerOn then
if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then
raise EOutOfResources.Create(SNoTimers)
else
FTimerOn := True;
end;
エラーの内容ですと何の問題も無いですが
個人的妄想の解決案を上げました
感想があればよろしくお願いします。
以上
KillTimer は SetTimer を実行していないと False を返す
TTimer を Destroy時にも UpdateTimer 呼ばれているから
Timerが動いてない状態でアプリを終了させると
KillTimer は False を返す
ン
マッコさんの意図は「ヨテフのソースコードを見ると、ヒヤを呼んで返り値をチェックしていないところがある。
試しに自分でチェックしてみたら、ニを返しているケースがあった。
気持ち悪いので、ニを返すようなケースでは呼ばないように直したい。例えばこう修正したらどうか?」
ということだと受け取りました。
まず、この掲示板はその手の議論に妥当な場所ではないと思います。
ナのフォーラムにでも投稿するべきでは?
ここであれこれ言ったところで、本家が直してくれるわけじゃないですし。
(あるいは「どこかに投稿する前に日本語の通じるところで意見を募りたい」かもしれないですが……
何にしても、質問に至った経緯とか、意見を募ってどうしたいとかもう少し明らかにしないと皆混乱するだけだと思います)
個人的な意見を言えば「行儀良いとは言えないけれど、実害はないし
目的(“タイマが設定されていない状態”になっているのを確実にする)は果たせているし
変に複雑にしてバグを作り込む可能性を増やすよりは、そのままの方がいいんじゃない?」です。
ツイート | ![]() |