写了一个线程是对数据库进行不断的更新和修改,但在关闭窗体的时候老是出现错误"在异步运行时,操作不能被执行",也许是因为关闭窗体的时候线程正在对数据库进行修改,所以我想在关闭窗体之前先判断一下线程,判断此次更新操作是否结束了
下面是我的线程
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;
请高手帮忙,高分答谢,急用
下面是我的线程
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;
请高手帮忙,高分答谢,急用
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(...);線程同步方法很多哦。。或者簡單的用一個全局變量也可以的。。
我找了资料好象在
var
Form1: TForm1;
hEvent:Thandle;
implementation
下面定义的