问题标签 [ttimer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
598 浏览

delphi - 如何最好地使用 Omnithread 转换多个 Delphi TTimer 后台扫描任务

我已经开始考虑使用 Omnithread 来使用多线程改进我的 Delphi 应用程序。文档很好地涵盖了创建一个或多个工作任务,因此我从按钮单击调用的长操作可以替换为此演示代码(Async、CreateTask 等)。我遇到的困难是如何替换我最“混乱”的代码,其操作如下。

我有一个对应于硬件模块的单个类实例的概念。该类发布了一个或多个属性,这些属性公开了硬件的当前值和设置。属性可能是只读的或读/写的。对于这些类实例中的每一个,可以有从零到几个可见的显示表单。显示表单具有 TTimer 和上述已发布属性的内置列表。该列表被迭代以匹配适当命名的控件,例如标签或编辑控件,并且使用 RTTI 机制来获取和设置控件及其属性之间的值。结果是一个表单,它为实际硬件模块提供了一个很好的 UI,其副作用是可以打开多个表单,修改其中一个表单上的数据会导致其他表单在不久之后显示该数据。此属性监视由 TTimer 以 300 ms 的间隔滴答执行。每个刻度使它扫描类的所有属性并刷新其窗体上的匹配控件。计时器在打开表单的生命周期内运行。表单在需要时创建然后释放(这具有有用的性能优化,即在没有打开表单来检查硬件的情况下,应用程序必须尽可能快地运行,因为没有监控任务可以运行)。

有没有更好的方法使用线程来访问我发布的属性,而不是在 UI 线程中使用 TTimer?或者同步问题是否会超过任何优势?如果线程很有用,如何创建重复任务,例如模拟滴答计时器?

0 投票
1 回答
1714 浏览

delphi - 我需要从 TTimer 事件中调用 Synchronize 吗?

当我从 a 访问全局变量或 VCL 时TTimer,我需要使用Synchronize吗?我使用 a 中的相同变量和对象TThread,我已经在其中使用了同步。

0 投票
1 回答
769 浏览

delphi - 有什么方法可以让 TTimer 着火之前剩下的时间?

可能重复:
Delphi Timer:下一个事件之前的时间

在 Windows 7 Pro(64 位)上使用 C++ builder XE:

我在表格上有一个 TTimer。

我想要做的是更新进度条以显示 TTimer 在调用 OnTimer 事件处理程序之前还剩下多长时间。

有什么方法可以找出直到 TTimer 的时间间隔触发 OnTimer 事件的时间太长?

0 投票
2 回答
2450 浏览

multithreading - 带有计时器事件和其他多线程客户端事件的 Delphi tIdTCPClient

我们有一个使用 INDY 的 Delphi 客户端服务器应用程序。客户端与服务器的单个 tIdTCPClient 连接是多线程的。客户端“理论上”是一个单线程。但实际上客户端上有多个线程,这就是我的问题所在。例如,考虑一个每分钟触发一次以从服务器获取数据的计时器。并考虑当用户在此计时器事件的同时运行命令时会发生什么。事实上,我的问题是由我们的“报表生成器”报表工具引起的,它(令人讨厌)坚持加载报表的每一页,这需要一段时间。该报告运行我们的“特殊”数据集,该数据集具有一次传输批量记录的缓存机制(因此多次调用服务器以获取所有数据)。同时,如果用户同时做其他事情,我们似乎得到了交叉数据。用户似乎取回了用于报告的数据。

顺便说一句,这个错误非常罕见,但对于拥有世界上最慢互联网的特定客户来说,这种情况要少得多(幸运的是,我现在有一个测试环境)。

所以在客户端我有这样的代码......

现在,当我调试它时,我可以确认当此过程中间有两个线程时它会出错。主线程在异常处停止。并且报告线程在同一过程中被卡在其他地方。

所以,在我看来,我需要使线程上面的过程安全。我的意思是,如果用户想要做某事,他们只需要等到报告线程完成。

Arrrgh,我认为我的客户端应用程序是单线程的,用于向服务器发送数据!

我认为使用 TThread 是行不通的——因为我无法访问 Report Builder 中的线程。我想我需要一个 tCriticalSection。

我想我需要制作应用程序,以便一次只能由一个线程运行上述过程。其他线程必须等待。

有人请帮助语法。

0 投票
1 回答
415 浏览

delphi - 谁在设计时绘制 TTimer?

谁在设计时绘制 TTimer?

在使用 Delphi IDE 的表单设计器时,当您在表单上放置一个 TTimer 时,该组件在设计时是可见的(当然,在运行时是不可见的)。

TTimer 类是在单元 ExtCtrls 中定义的,所以我当然确实阅读了该单元中的 TTimer 源代码。

我期待看到这样的东西:

但是我很惊讶没有看到这样的代码!

TTimer 组件有这个私有字段:FWindowHandle: HWND;,但它仅用于接收来自 windows 本身的 WM_Timer 消息。它不用于绘制任何东西,即使在设计时也是如此。也没有画布。

在阅读 TTimer 源代码时,我找不到与设计时绘画相关的任何内容。

所以问题是:什么代码以及在哪里负责在 Delphi IDE 本身的表单设计器中的表单上绘制 TTimer 的设计时间外观。

现在,如果有人想知道我为什么要问这个问题,这里有一些相关信息:

在 StackOverflow 的其他地方,有人问是否可以在运行时加载 .dfm 文件。有人回答:“不,不可能”

但这并不完全正确。我已经编写了一些代码来做到这一点:从磁盘加载“someform.dfm”并在运行时创建这样的表单。这是可能的,但令人讨厌的是,您需要编写如下代码:

这只是第一个示例,它可以让我加载并呈现一个特定的表单而不会出错。但是,只要其他表单包含,例如:TSpeedbutton,则需要编辑上述程序以添加此行:

跳过它,你会得到一个“找不到类 Txxx”的异常。

另一个问题是,即使我添加了代码以查找要加载的 dfm 中的任何 TTimer 组件,并且我在该 TTimer 实例的 ComponentState 中手动设置了 csDesigning,TTimer 仍然保持不可见。

那么我需要做什么(其他)才能使 TTimer 像在 Delphi IDE 的表单设计器中一样可见?

0 投票
2 回答
1365 浏览

delphi - Delphi:显示一个 TTimer

是否可以在 Label 中显示 TTimer 的倒计时?就像立即将变量放入标签标题中一样。我在想我该怎么做,我试图在表单中做一个可见的倒计时。

0 投票
1 回答
696 浏览

code-analysis - 抑制重新触发 Windows 计时器的误报警告

我希望使用 VCL6TTimer对象重新触发 Windows 计时器。我通过切换Enabled属性来做到这一点,这当然会令人困惑,但我对此添加了评论。对于 Cppcheck,我还用它的语言添加了一条评论:

...但这显然没有帮助,我仍然看到这种风格警告:

在使用旧变量之前,变量“已启用”被重新分配了一个值。

我究竟做错了什么?

0 投票
2 回答
3243 浏览

delphi - 自动刷新 TDataSet / DBGrid

我正在开发一个DBGrid通过TSimpleDataSet(dbExpress 组件)显示信息的软件

有问题的软件由 2 个不同的人在 2 台不同的计算机上使用。

他们都在不同的时间查看和编辑相同的信息。我正在尝试找出一种方法来自动更新计算机 B 上的DBGrid(或者更确切地说是DataSet,对吗?),一旦计算机 A 对一行进行更改(编辑某些内容/任何内容),反之亦然。

目前我已经设置了一个TButton名称Refresh,一旦点击执行以下代码:

这很好,一旦点击就可以按预期工作。我想要一个自动更新功能,例如当计算机 A 连续编辑信息时,计算机 BDBGrid应该相应地更新它的显示,而无需单击刷新按钮。

我想我会TTimer在两台 PC 上的两个软件上使用 a 并将其设置为特定的时间间隔。

我的实际问题是:

有没有比 a 更好的方法TTimer呢?如果有,请详细说明。此外,如果TTimer路线是去任何进一步信息的方式,您可能会发现对状态有用的信息将不胜感激(赞成和反对等)

我正在使用 Rad Studio 10 Seattle 和dbExpress组件,数据集连接到我的网站所在主机上的 MySQL 数据库。

谢谢!

0 投票
2 回答
363 浏览

windows - TTimer 实际上是如何在内部工作的?

间隔设置为 1 秒的 TTimer 每 1 秒发送一条消息。此消息在应用程序的消息循环中进行处理,从而触发 OnTimer 事件。
如果应用程序很忙并且没有时间处理消息循环,则跳过 OnTimer 事件。

我知道 TTimer 在内部使用SetTimer

我的问题是:

  1. TTimer 是否使用内部/单独的线程(通过 SetTimer)?
  2. 如果模态 MessageDlg 正在“阻止”表单,那么保存计时器(甚至它的 OnTimer)的表单为什么仍然可以做事呢?(见下面的代码)
  3. 文档说 SetTimer 至少需要 Win2000。TTimer在Win98中是如何实现的?

0 投票
1 回答
255 浏览

delphi - Delphi TTimer 在 Win 10 中提供不寻常的结果

我有一个应用程序,允许我的用户打开和关闭计时器来跟踪他们在某项任务上花费的时间。计时器运行一个时钟,用于向用户显示经过的时间,就像秒表一样。

下面的代码已经像我认为的那样工作了几年。但是,当应用在 Win 10 上运行时,有时“时间”速率会在一个会话期间加快 2 或 3 倍。如果用户重新启动应用程序,它可能会以正常速度运行。

赢得 10 德尔福 10.3