线程异常以后如何恢复(200分)

  • 主题发起人 主题发起人 nhqing
  • 开始时间 开始时间
N

nhqing

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TMyThread.Execute();
var
iResult : integer;
begin
CoInitialize(nil);
ShowError('正在连接数据库!');
iResult := Prepare();
if(iResult<0) then
begin
ShowError('数据库连接失败!请检查配置或网络连接情况!');
Exit;
end
else
begin
while(True)do
begin
ShowError('数据库已连接!正在同步数据库!');
if(iresult=0)then
SyncDataServer()
else
SyncDataLocal();
ShowError('数据库同步结束!');
sleep(10000);
end;

end;
CoUninitialize();
end;

这个线程正常的情况下可以执行,但是一但 SyncDataServer() 和SyncDataLocal();
执行出现异常的情况,线程就不能执行了,请那位老大帮忙解决一下
 
procedure TMyThread.Execute();
var
iResult : integer;
begin
CoInitialize(nil);
ShowError('正在连接数据库!');
iResult := Prepare();
if(iResult<0) then
begin
ShowError('数据库连接失败!请检查配置或网络连接情况!');
Exit;
end
else
begin
while(True)do
begin
ShowError('数据库已连接!正在同步数据库!');
try
if(iresult=0)then
SyncDataServer()
else
SyncDataLocal();
Except
TMyThread.Create(false);
//如果是默认的话。这个地方(TMyThread.Create(false))可能会死循环,
//自己根据情况处理一下,不过如果是有异常,说明程序逻辑或实现上还是有问题,应该从
//根本入手。
end;
ShowError('数据库同步结束!');
sleep(10000);
end;

end;
CoUninitialize();
end;
 
根据你这个应用,我还是推荐你使用定时器。
刚才我又看了你的完整代码,还是觉得定时器好。
 
ShowError是个啥意思?
没见过这个函数
 
这种用法没怎么用过。我好像在线程中弹出窗口,会有问题,不知道有没有高人解释下。[:D]
 
如二楼用try..except..end结构,把异常拦截下来,然后线程中不要有弹出窗口,实在要弹出窗口的话给主窗体发消息,PostMessage(MainForm.handle, ....),让主窗体处理,不要在线程里直接弹出,否则线程会等待窗体返回而停掉
 
一个月了。顶
 
后退
顶部