TTimer没有开火

Pet*_*ist 3 delphi timer delphi-7 windows-7

我有一个奇怪的问题.我的主表单上有一个TTimer,应该触发500毫秒.创建表单后.

当我从IDE运行它时它工作正常,但是当我在其他W7 PC上运行时,主窗体被创建,但计时器不会触发.(某些组件未更新)如果我单击一个控件,一切都会更新,计时器会触发,一切都很好.如果我移动表单,每个东西都会更新,但计时器不会启动.如果我在安装了Delphi的PC上运行它,它可以正常工作.没问题.

MyForm.OnCreate中的代码执行正常.Timer.Enabled := True没有变化.

知道是什么原因引起的吗?我真的被困在这里了.

最好的祝福.

War*_* P 5

有各种各样的可能性:

  1. WM_TIMER消息仅在消息队列为空时传递.如果您的应用程序中的某些内容或在其他计算机上运行的其他应用程序中的某些内容经常将消息发布到窗口句柄,该窗口的消息队列永远不会清空,则WM_TIMER事件将永远不会触发.如果发生这种情况,您可能需要等待正常的TTimer期间的10倍或20倍或30倍,但事件最终可能会发生.到目前为止,我还没有观察到计时器根本不会发射的任何情况,但这当然在理论上是可能的......

  2. 虽然您说您确定计时器已启用(您已将其设置为启用),但您的代码中的某个ELSE可能会禁用它.

  3. 如果你正在做一些尝试...除了......端块并忽略异常,那么可能会发生一些你在其他机器上看不到的坏事.

  4. 您的计时器代码可能会被触发,但在计时器上运行的代码中可能会发生异常,崩溃或挂起.

  5. 您可能在代码中有一些Delphi事件处理程序,这些处理程序会产生几乎"无限循环"的情况,因为您编写的某些事件处理程序在您不希望它们时会触发,从而导致副作用,从而保留您的应用程序忙.你提到你在某个地方点击,问题就消失了.该单击可能足以中断代码中的其他恶意循环.

  6. 你提到它可以在安装了delphi的任何PC上运行.您使用的第三方控件是否存在一些限制(例如要求您在调试器中运行?).或者您的应用加载了一些未安装在其他计算机上的DLL或BPL?

从一个没有任何内容的全新应用程序开始.添加TTimer.现在在timer事件上增加一个整数字段值并将该值写入表单的标题.现在在其他机器上运行它.它会工作正常.

现在去看看你写的那堆巨大的代码,然后决定如何将你的巨大代码一分为二,找到被破坏的一半.经过足够的步骤,你会发现你的问题.这里没人能为你调试它.

尝试添加一些日志消息,OutputDebugString在其他计算机上使用和运行DebugView,如果要在另一台计算机上查看应用程序的某些内部结构

  • 7. 此窗体或其他窗体上的某些组件可能会导致主线程反应过度,从而无法传递 WM_TIMER (#1) 消息。第三方组件(或内置组件)也可以做到这一点。例如,像“TADOConnection”这样的数据库连接正在尝试连接到数据库并且需要时间。 (2认同)