在多线程程序中,程序要关闭,但此时还有线程正在执行,如何才能实现点关闭时,等到当前所有线程执行完后再关闭程序。以下是我的代码,但这样关闭程序会报内存错误。
FThreadList是TThreadList类型的对象,请各们大侠指点。procedure TFrm_Main.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
i: integer;
FList: TList;
ret: DWORD;
begin
SendTimer.Enabled := false;
if FThreadList <> nil then
begin
try
FList := FThreadList.LockList;
for i := FList.Count - 1 downto 0 do
begin
repeat
//TClientThread(FList.Items[i]).Terminate;
ret := WaitForSingleObject(Cardinal(FList.Items[i]), 100); //等待
Application.ProcessMessages;
until ret <> WAIT_TIMEOUT;
FList.Remove(FList.Items[i]);
end;
finally
FThreadList.UnlockList;
end;
FThreadList.Free;
end;
if fDBCommon <> nil then
fDBCommon.Free;
CanClose := true;
end;
FThreadList是TThreadList类型的对象,请各们大侠指点。procedure TFrm_Main.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
i: integer;
FList: TList;
ret: DWORD;
begin
SendTimer.Enabled := false;
if FThreadList <> nil then
begin
try
FList := FThreadList.LockList;
for i := FList.Count - 1 downto 0 do
begin
repeat
//TClientThread(FList.Items[i]).Terminate;
ret := WaitForSingleObject(Cardinal(FList.Items[i]), 100); //等待
Application.ProcessMessages;
until ret <> WAIT_TIMEOUT;
FList.Remove(FList.Items[i]);
end;
finally
FThreadList.UnlockList;
end;
FThreadList.Free;
end;
if fDBCommon <> nil then
fDBCommon.Free;
CanClose := true;
end;
解决方案 »
- delphi edit自动提示
- DLL返回PCHAR问题?
- Delphi中的基本类型,跟SQL server中的数据类型有一一对应的吗??有能给出对应的关系吗?
- 关于程序界面(皮肤)解决方案的初步讨论
- 全国范围Delphi程序员的现状和薪资调查?
- 关于TListView的GetNextItem(ListItem,Direction,States);问题
- 如何把QuickReport里面的QrLabel的所有字符旋转90度,并且字符串也转90度?
- 怎样往程序中加入一个非可视控件?
- 一初学者有关SQL特殊查询的使用问题
- 怎样在Delphi中创建ACCESS数据库?
- 您有理想吗? 您有追求吗? 35岁之后我能干啥?
- 请问delphi中,我想把变量的值打印出来,用什么语句?
你这样一直等到线程完成再退出就有点太霸道了。呵呵
在线程的Execute循环体中加上 if Terminated then exit
退出窗体时再写上:
FThreadList.Terminate;
FThreadList.free;
但我觉得不一定要写 FThreadList.FreeOnTerminate:=true; 在线程Terminate时自动释放,反正线程Terminate后就关闭窗体了。