delphi - 仅在线程/计时器内执行一次命令但保持线程/计时器运行?

标签 delphi

这是线程内代码的一部分(或者它可能是一个计时器,没关系):

timenow := Now;
strtime := FormatDateTime('hh:nn:ss', timenow);
if frmBackup.getmetime = strtime then
begin
  frmBackup.lawl.Position := frmBackup.lawl.Position + 10;
end;

基本上,进度条只是一个测试,以了解它已经执行了多少次。到目前为止,我无法多次阻止它执行。我需要它执行一次(当 getmetime = strtime 时),然后继续线程/计时器而不执行代码,只在时间到来时再次执行它。

可能吗?

谢谢!

最佳答案

在 frmBackup 上放置一个 bool 标志:

timenow := Now;
strtime := FormatDateTime('hh:nn:ss', timenow);
if (frmBackup.getmetime = strtime) and (not frmBackup.RanOnce) then
begin
  frmBackup.lawl.Position := frmBackup.lawl.Position + 10;
  frmbackup.RanOnce := true;
end;

此外,尝试使用 = 来比较时间时要小心。如果您的计时器比您的目标时间晚触发一秒,无论出于何种原因,您的代码都会失败。最好使用 >= 或在比较中建立一些误差范围。 (并使用直接 TDateTime 比较而不是字符串比较。)

还有一件事:如果您实际上在另一个线程中(而不是在同一线程上运行的计时器),则更新 VCL 控件将以奇怪的方式失败,因为底层 Windows API 内容具有线程关联性你的程序的主线程。如果您打算这样做,请查看 TThread.SynchronizeTThread.Queue 并使用其中之一进行 UI 更新。

关于delphi - 仅在线程/计时器内执行一次命令但保持线程/计时器运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8317752/

相关文章:

delphi - 嵌套异常的正确方法是什么? -使用Delphi

delphi - 如何从 TTreeView 中删除节点及其对象

delphi - Web 浏览器和 OLECMDID_SELECTALL

delphi - Indy TCP 客户端/服务器,客户端充当服务器

linux - Linux 上通过 ODBC 的 Delphi SQLConnection 无法连接到 SQL

delphi - TImage在D7(免费版)中似乎不支持Jpeg?

windows - 查找物理适配器的 MAC 地址

delphi - 如何处理在Delphi 中挂起的第三方函数或线程?

delphi - 当函数中引发异常时,TStrings 返回为 "Inaccessible value"

mysql - Lazarus 插入 sql 结果 int 字符串网格