【发布时间】:2020-09-10 21:27:03
【问题描述】:
我的应用程序的外部进程每个都轮询一个布尔值以查看是否有工作要做。我现在想在 Timer 事件中检查该变量以减少“未响应”消息。
必须将 Timer 对象放在表单上,这似乎会造成一些限制。
使用Me.Show (vbModal) 从表单启动事件效果很好。只是我不想实际显示该表格,我只想使用计时器。尝试使用 Me.Hide 隐藏表单然后失去我需要的模态行为,所以这不是一个好的解决方法。
我尝试从一个类启动事件,但它表现出与 Me.Hide 相同的不良行为:处理返回给调用者,而不是停留在等待工作的计时器事件子中。
有什么方法可以实现基于Timer 的事件,不需要显示表单并且不会立即返回给调用者? 外部进程没有屏幕 IO,也没有想要的。
【问题讨论】:
-
您似乎不了解阻塞调用和异步调用协议和约定之间的区别和上下文。如果您不阻止调用者(例如,通过模态表单调用),那么执行当然会返回给调用者。实际上,这就是目标。由于您不想显示模态表单,因此您需要重新设计调用者代码,以便它期望接收回执行,但它会暂停执行,直到异步任务(通过计时器运行)完成。 Etienne 的回答和链接为如何在 VB6 中做到这一点提供了指导。
-
是的,我想这是我的期望偏离的问题。最初我希望有一种简单的方法可以使表单隐藏和模态。在启动工作循环(线程?)并返回给调用者之后必须处理该过程似乎很奇怪。所以现在我们有了(我猜是启动了一个线程来完成这项工作),但我仍然需要处理 ret。我想实际执行工作的“线程”占用与子进程(刚刚返回的)相同的内存空间,所以最好让他提供 DoEvents 供工作“线程”使用。谢谢你的评论。 -鲍勃
-
不久前,我下载并研究了由著名的 Karl E. Peterson 创建的演示,ccrpTmr6.zip。在计时器事件处理的上下文中,它很好地显示了阻塞与非阻塞的差异。顺便说一句,我认为他可能是你们,你们也可能是他。因此,如果我从 sub Main() 开始演示并将 Me.Show 放在 Form_Load 子中,则事件处理似乎在从 Form_Load 返回之后开始。但是,如果我将 Me.Show(vbModal) 放在 Form_Load 中,则处理从那里开始并且不会返回给调用者。这是我想效仿的“不返回调用者”行为。 -鲍勃