实际上,我正在使用此代码并运行正常,但是我想知道是否正确。

  while WaitForSingleObject(MyThread.Handle, 0) = WAIT_TIMEOUT do
    Application.ProcessMessages;

  ShowMessage('i am done');
有帮助吗?

解决方案

打电话 Application.ProcessMessages 通常被认为是代码气味。如果无关紧要的话,让您的主线程闲置。

如果您经营一家公司,需要您的一名工人来跑到商店并抢购一些急需的用品,那么您会在门前步伐,直到他回来,或者您想坐在办公室里休息并等待他,发现供应在这里,因为您听到他走过门?无论哪种方式,他都会花费相同的时间,但是第一种方法会把你的腿戴出。

同样,不要让UI观看线程,而是将线程报告回到UI。一种方法是让线程使用 PostMessage 要将自定义消息发送到启动的表单后,并将消息处理程序放在表格上以响应它。

其他提示

VCL TThread类有自己的 WaitFor() 当主线程中的情况下调用时内部泵送主消息队列的方法:

MyThread.WaitFor; 
ShowMessage('i am done'); 

它看起来正确(如果正确意味着它可以完成工作)。我要更改的是等待更多时间(50毫秒看起来不错,可以保持应用程序响应能力),而不吃CPU。

while WaitForSingleObject(MyThread.Handle, 50) = WAIT_TIMEOUT do
  Application.ProcessMessages;
ShowMessage('i am done');

确保还有其他方法可以做...u003Cjoke>但是我通常采用主要的工程原则之一:

如果有效,请不要触摸它!u003C/joke>

我同意梅森·惠勒(Mason Wheeler)的说法,主要线程最好是完成工作,但我建议在线程上使用Onterminate事件。它更是“ Delphi自然”,并且内部逻辑为您提供后词。由于tthread不是组件,因此您无法在对象检查器中查看它,必须自己编写和附加事件处理程序。线程完成/终止后,它将被调用(在主线程中!)。

虽然看起来还不错,就像 jachguate 我也会使用比0更大的超时值。如果您使用 WaitForSingleObject(MyThread.Handle, 100) 然后,主线程将等待更长的时间,从而减少CPU周期。
不过,更好的解决方案是使用消息。您的应用程序启动线程,然后将所有控件置于禁用模式。然后该线程执行并完成后,使用 发信息 或者 邮政 到主窗口通知该线程再次完成。然后,您的应用程序将再次启用每个控件(以及其他任何控件)。这具有优势,您可以将“自然” Messageloop保留为应用程序,而不是使用此解决方案运行自己的Messageloop。
不幸的是,消息方法有一个缺点:如果线程崩溃,则不会发回消息,因此备份计划将是实用的。例如,通过将计时器控件添加到主题中,该计时器控件是否还活着,每秒检查一下。如果没有,它也只会再次激活表单,再次禁用自身。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top