簡體   English   中英

Delphi Game Timer 程序在 1.5 到 2 小時后凍結,有時會出現異常“Canvas 不允許”

[英]Delphi Game Timer program freezes up after 1.5 to 2 hours and sometimes gives an exception "Canvas does not allow"

我有一個簡單的程序,單線程,有一個有控件的主窗體,另一個窗體有 bitmap 和 bitmap 之上的一些 TLabels,有得分,時鍾時間,罰時隊和周期。

在我的主窗體中,我有一個間隔為 500 毫秒的 TTimer,它在啟動時計算時鍾和任何懲罰時間,因為它倒計時並更新另一個窗體上的標簽。 定時器事件中的基本代碼是:

  // decrement main clock
  if ClockEndTime > Now then
    begin
      MainClockTime := ClockEndTime - Now;
...
  else
    // clock time is expired
    begin
      MainClockTime := ZeroTime;
      tmrMainClock.Enabled := False;
      ClockRunning := False;
...
    end;
    // update the timer values and overlay
    lblClock.Caption := FormatDateTime('n:ss',MainClockTime);
    fOverlay.lblClock.Caption := lblClock.Caption;
...

1 到 2 小時后,main from 將停止響應,並且出現“Canvas 不允許”異常。 帶有標簽和 bitmap 的表格在應該是時鍾的地方有一個空白點。

異常錯誤

我必須關閉並重新啟動程序才能再次運行。 即使在我確認異常后,主窗體上的所有控件都不會響應。 似乎 TTimer 事件可能仍在觸發並具有相同的繪制問題。 我有另一個 function 的熱鍵,它在程序似乎被凍結時仍然有效。

我在更新 label 字幕的地方嘗試了計時器事件中的異常處理程序。 它從不顯示我的消息框,但是當我添加代碼以關閉另一個窗體時,它似乎會轉到異常處理程序,等待一段時間,然后重新打開它。 另一個形式消失並返回,但隨后似乎沒有任何東西可以畫在它身上。 它顯示了它背后的背景。

您認為這是一個問題,因為我的主表單代碼正在更新另一個表單上的標簽嗎?

很難測試,因為它需要等待 1 到 2 小時才能使問題重新出現。 我想知道,有沒有人經歷過這樣的事情?

我用的是Delphi 10.4社區版,程序運行在Windows 11。

我上次測試時注意到的一件更有趣的事情是,當我的程序試圖更新標簽時,它還在我運行的一個完全不相關的 Delphi 7 程序上產生了一個 GIF 圖像來移動位置。 我不知道為什么一個程序會影響另一個程序。 它們唯一的共同點是使用 TTimer。

問題是我用來從屏幕獲取像素顏色的 function。 我在我的 TTimer 事件中調用了這個 function。

function TfConfigureMute.GetPixelColor(X,Y: integer): TColor;
var
  dc: HDC;

begin
  // Get Device Context of windows desktop
  dc := GetDC(0);
  // Read the color of the pixel at the given coordinates
  Result := GetPixel(dc,X,Y);
  ReleaseDC(0,dc);
end;

我最初缺少ReleaseDC(0,dc); 線。 這就是泄漏。

謝謝你的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM