写了一个线程是对数据库进行不断的更新和修改,但在关闭窗体的时候老是出现错误"在异步运行时,操作不能被执行",也许是因为关闭窗体的时候线程正在对数据库进行修改,所以我想在关闭窗体之前先判断一下线程,判断此次更新操作是否结束了
  下面是我的线程
  unit UpdateThread;interfaceuses
  Classes,IdGlobal,ADODB,Registry,SysUtils,Windows,Messages;type
  TUpdateToLB = class(TThread)
  private
    { Private declarations }
  protected
    procedure updateLB;
    procedure Execute; override;  end;implementation
uses FormUpdate,DataModule;procedure TUpdateToLB.updateLB;
begin
     with LBUQuery do            //更新部门表
     begin
       close;
       sql.Clear;
       sql.Add('delete  from 部门表 ');
       ExecSQL;
     end;
     with WDSQuery do
     begin
       close;
       sql.Clear;
       sql.Add('select ID,Name from Department order by id ');
       open;
       first;
       for TempI:=0 to WDSQuery.RecordCount-1 do
       with LBUQuery do
       begin
         close;
         sql.Clear;
         sql.Add(format('insert into 部门表(部门ID,部门名称)  values(%d,''%s'') ',[WDSQuery.FieldByName('ID').Asinteger,WDSQuery.FieldByName('Name').AsString]));
         ExecSQL;
         WDSQuery.Next;
       end;
     end;
   end;
   sleep(SleepTime);
end;procedure TUpdateToLB.Execute;
begin
  FreeOnTerminate:=true;
  while not Terminated do
  begin
    updateLB;
  end;
end;
end.一开始我在FormClose事件中直接写SecondProcess.Terminate;程序经常出错
procedure TfrmUpDate.FormClose(Sender: TObject; var Action: TCloseAction);
begin 
  SecondProcess.Terminate;       //SecondProcess为线程名
end;
请高手帮忙,高分答谢,急用

解决方案 »

  1.   

    可以使用 Event對象procedure TfrmUpDate.FormClose(Sender: TObject; var Action: TCloseAction);
    begin 
      WaitForSingleObject(hEvent, INFINITE); // 等待工作線程操作完畢
      SecondProcess.Terminate;       //SecondProcess为线程名
    end;procedure TUpdateToLB.Execute;
    begin
      FreeOnTerminate:=true;
      while not Terminated do
      begin
        updateLB;
        // here
        SetEvent(hEvent); // 表示操作完畢了哦。。
      end;
    end;
    end.FormCreate時 hEvent := CreateEvent(...);線程同步方法很多哦。。或者簡單的用一個全局變量也可以的。。
      

  2.   

    哦 不好意思 你這邊用全局變量雖然可以判斷 線程是否結束 可是 關閉 會有一些問題。。還是 使用 上面的 采用 事件進行同步吧。。hEvent: THandle; // 定義為 private的member即可。
      

  3.   

    请问:什么叫定義為 private的member即可?
    我找了资料好象在
    var
     Form1: TForm1;
     hEvent:Thandle;
    implementation
    下面定义的