让表单关闭时保持线程运行

时间:2011-02-02 06:20:43

标签: multithreading delphi

我在我的应用程序上创建了一个同步线程,我想知道有没有办法让线程保持打开状态,直到完成它的同步过程,如果我关闭申请表?

2 个答案:

答案 0 :(得分:6)

WaitFor行之后调用DPR文件中的线程Application.Run方法。如果线程已经完成运行,则WaitFor将立即返回。否则,它将暂停主线程,直到另一个线程终止。 (您必须确保该变量仍引用有效的TThread实例,因此请勿设置其FreeOnTerminate属性。)

除了允许线程继续运行的简单问题之外,您还可以考虑其他一些事项:

  • 如果操作系统正在关闭或用户正在注销,程序只有有限的时间停止运行,因此您可能没有时间等待同步完成,直到操作系统终止程序。
  • 用户可能想知道为什么程序仍然在运行,即使他们告诉它关闭,所以考虑在同步继续时显示一些UI。
  • 用户可能不关心同步,如果他们赶时间并且需要程序立即停止运行,那么在该UI中,您可能希望提供“中止同步”命令。

答案 1 :(得分:1)

在Rob的优秀答案的评论中,提出了在等待时显示UI的问题。如果您需要在等待时显示UI,则需要更高级的等待TThread.WaitFor。这就是我所依赖的MsgWaitForMultipleObjects

procedure WaitUntilSignaled(Handle: THandle; ProcessMessages: Boolean);
begin
  if ProcessMessages then begin
    Application.ProcessMessages;//in case there are any messages are already waiting in the queue
    while MsgWaitForMultipleObjects(1, Handle, False, INFINITE, QS_ALLEVENTS)=WAIT_OBJECT_0+1 do begin
      Application.ProcessMessages;
    end;
  end else begin
    WaitForSingleObject(Handle, INFINITE);
  end;
end;

....

Form.Show;
WaitUntilSignaled(Thread.Handle, True);
Form.Close;