我的的程序里面开了几十个子线程;我在主界面上点退出之前是先关闭子线程,然后用 close;但刚进去不久可以退出来,但进去运行一段时间后,就点退出没有反映,也不会出错,就是退不出;要去强行关闭才行可用分不多了,见谅。
解决方案 »
- 哪里可以下载到开源的视频会议源码???谢谢
- ADOTABLE和ADOEDIT怎么做插入语句
- 程序退出时,弹出错误提示框怎么办?
- 为什么C#传给Delphi做的DLL中的string变量,跟踪调试DLL发现传过来的字符串"COM1"变成了C'#'O'#0等乱码?
- 问一个巨简单的问题
- 高手能不能给一个登录access数据库的例子!!!
- 请求帮助,高分赠送
- 关于stringgrid的 问题 ,急~!!
- 如何控制文件的读写性
- 这里是一个扑克游戏源代码,请问如何怎样编写运行过程中生成的对象的事件处理过程?,
- Fast Report 4 连接数据库打印,如何打印选择的记录?
- 在XP系统下,如何检测USB口打印机状态?
在TThread的说明中是建议我们在执行体中不断地判断线程的teminated是否为真,如果为真,则退出执行体,以达到Terminated:=True的效果,否则,线程还是会执行完Execute才会退出线程.
因为我点退出时还没有到关子线程和退主程序的步骤,这是我退出按钮的代码
procedure TFMMain.BExitClick(Sender: TObject);
var Isspy:boolean;
j:integer;
begin
application.ProcessMessages;
if BPause.Tag=0 then
begin
IsSpy:=true;
BPauseClick(Nil);
end else
IsSpy:=false;
closePassWord:=''; application.ProcessMessages;
PasswordDlg:=TPasswordDlg.create(self);
try
PasswordDlg.ShowModal;
finally
PasswordDlg.free;
end; if ClosePassWord <> '' then
if ClosePassWord = LoginUserInfo.UserPassword then
begin
DM.Qtemp.close;
DM.Qtemp.SQL.Text :='update UserLoginInfo ' +
' set LogoutTime = '+floattostr(myDSub+DBaseTime)+
' where (LogoutTime IS NULL) and (WorkerID = '''+ LoginUserInfo.UserID+''')';
try
DM.Qtemp.ExecSQL ; DM.qtemp.Close;
DM.qtemp.SQL.Text:='select DISTINCT(ComID) from passState where Kind > 0 and (computer = '''+mycomputer+''' or computer = '''+LocalIP+''') '+sPassID+' order by ComID ';
DM.qtemp.Open; while not DM.qtemp.eof do
begin
application.ProcessMessages;
Com_Thread[DM.qtemp.fieldbyname('ComID').AsInteger].Terminate;
application.ProcessMessages;
sleep(100);
DM.qtemp.next;
end; Spy_Thread.Terminate;
// CloseAllConnect();
except
end; sleep(1000); close;
end else
begin
messagedlg('ÃÜÂë´íÎó',mtwarning,[mbok],0);
if IsSpy then
BPauseClick(Nil);
end; //Setevent(Spy_event);
end;这个是BPauseClick的代码procedure TFMMain.BPauseClick(Sender: TObject);
begin
if BPause.Tag=0 then
begin
application.ProcessMessages;
BPause.Caption:='¼à ¿Ø(&P)';
BPause.Tag:=1;
Resetevent(Spy_event);
Pauseed:=true;
Setevent(Relay_event);
application.ProcessMessages;
end else
begin
application.ProcessMessages;
BPause.Caption:='ÔÝ Í£(&P)';
BPause.Tag:=0;
Setevent(Spy_event);
Pauseed:=false;
Resetevent(Relay_event);
end;
end;
1.terminate;
2.在execute程序中要运行到 terminated:=true的地方。(就是说,外部其他线程不能直接关闭在循环中的本线程。
3.本线程还有一个属性freeonterminate :=true;