我建立一个类来管理一个线程。这个线程的结构是
while not terminated do
begin   while (i<条件) do
     begin       这里是个执行很长时间的任务,问题就出在这里,用户如果关闭程序,这里还没有执行完怎么办?这里是往数据库里写
      数据的操作,很消耗时间。如果用户退出,我必须保证数据都写入数据库里才行。想知道如何做到用户点退出按钮的时候
     必须等到任务完成后,程序才真正退出
     end;
end;

解决方案 »

  1.   

    1,利用TEVENT变量,子线程开始运行时无信号,结束时(子线程的EXCUTE最后)有信号,主程序退出时等待这个信号,
    AEvent.WaitFor(AWaitTime)
    2,线程变量是运行时无信号,结束了有信号,可以利用这个,用WaitForSingleObject()或WaitForMultipleObjects()参考:http://blog.csdn.net/jankercsdn/article/details/51323690
      

  2.   

    如果你是使用XE及以后版本,可以使用TCountdownEvent
    program Project1;{$APPTYPE CONSOLE}uses
      SysUtils,
      Classes,
      SyncObjs;type
      MyThread = class(TThread)
      protected
        procedure Execute(); override;
      end;var
      Wait: TCountdownEvent;{ MyThread }procedure MyThread.Execute;
    begin
      Sleep(Random(3000));
      Wait.Signal();
    end;var
      i: Integer;
    const
      THREAD_COUNT = 100;
    begin
      Wait := TCountdownEvent.Create(THREAD_COUNT);
      for i := 1 to THREAD_COUNT do
      begin
        MyThread.Create(False);
      end;
      Wait.WaitFor();
    end.