繁体   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