TTimerでのKillTimerの使い方の疑問


マッコ  2015-05-31 23:00:52  No: 47350

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;
エラーの内容ですと何の問題も無いですが
個人的妄想の解決案を上げました
感想があればよろしくお願いします。 
以上


KHE00221  2015-06-02 15:02:50  No: 47351

KillTimer は SetTimer を実行していないと False を返す

TTimer を Destroy時にも UpdateTimer 呼ばれているから
Timerが動いてない状態でアプリを終了させると
KillTimer は False を返す


tor  2015-06-02 17:50:22  No: 47352

マッコさんの意図は「ヨテフのソースコードを見ると、ヒヤを呼んで返り値をチェックしていないところがある。
試しに自分でチェックしてみたら、ニを返しているケースがあった。
気持ち悪いので、ニを返すようなケースでは呼ばないように直したい。例えばこう修正したらどうか?」
ということだと受け取りました。

まず、この掲示板はその手の議論に妥当な場所ではないと思います。
ナのフォーラムにでも投稿するべきでは?
ここであれこれ言ったところで、本家が直してくれるわけじゃないですし。
(あるいは「どこかに投稿する前に日本語の通じるところで意見を募りたい」かもしれないですが……
何にしても、質問に至った経緯とか、意見を募ってどうしたいとかもう少し明らかにしないと皆混乱するだけだと思います)

個人的な意見を言えば「行儀良いとは言えないけれど、実害はないし
目的(“タイマが設定されていない状態”になっているのを確実にする)は果たせているし
変に複雑にしてバグを作り込む可能性を増やすよりは、そのままの方がいいんじゃない?」です。


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

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






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