线程Suspend为什么停不下来?GetLastError获取的错误不能被try except捕获吗

问题描述

线程Suspend为什么停不下来?GetLastError获取的错误不能被try except捕获吗

##说明

  • Delphi版本是6
  • 这个问题是在客户的环境上出现的,现在没办法再通过改代码的方式去验证

GetLastError

  • GetLastError是获取调用系统API出现的报错信息
  • 这种类型的错误能够被 try except 方式的异常机制捕获吗?

线程

  • 使用Delphi实现的一个线程,代码如下
  • GetLastError获取的错误码是2,并没有捕获异常,但是线程持续运行,说明suspend没有起作用
  • 另外,线程反复输出如下信息,并没有报错,说明压缩成功,走到suspend方法调用的代码行
正在压缩文件,请稍候...
压缩文件完成
GetLastError:2
正在压缩文件,请稍候...
压缩文件完成
GetLastError:2
正在压缩文件,请稍候...
压缩文件完成
GetLastError:2
……
……

为什么线程没有正常suspend而停止运行,反而是一直循环,根本停不下来

procedure TZipTask.Execute;
var
  bSuccess: Boolean;
  index: Integer;
  iError: Integer;
begin
  while not Terminated do
  begin
    try
      index := GetCurrentThreadId;
      SendMsg('正在压缩文件,请稍候...');
      ......//这里调用封装的一个压缩文件的API
      if bSuccess then
        SendMsg('压缩文件完成')
      else
        SendMsg('停止压缩文件');
    except
      on e:Exception do
      begin
        SendMsg('压缩文件出错' + E.Message);
      end;
    end;
    bComplete := True;
    Self.Suspend;
    iError := GetLastError;
    SendMsg('GetLastError:' + IntToStr(iError));
  end;
end;
时间: 2024-09-20 04:39:43

线程Suspend为什么停不下来?GetLastError获取的错误不能被try except捕获吗的相关文章

linux-fstat 读取3g大文件,获取文件大小错误显示Value too large for define data type

问题描述 fstat 读取3g大文件,获取文件大小错误显示Value too large for define data type fstat 读取3g大文件,获取文件大小错误显示Value too large for define data type 解决方案 提示信息:需要定义更大的数据类型呀. 解决方案二: Value too large for defined data typegcc 编译错误 Value too large for defined data typereaddir 报

window service 里用Timer 调用 SFTP组件,但是其中某个线程会自动停掉,求救

问题描述 附上源代码:下载源代码后可以看UploadService.cs,还请大侠们帮忙啊,一直没有解决的问题,比如说,ONSTART里面根据数据库的数据启动了5个线程A,B,C,D,E,每个线程启动一个TIMER,TIMER里运行UploadFile方法,调用第三方组件SFTP,每次连接的时候我会写一个LOG出来,记录一下是否连接成功了,过了几天发现其中某个线程B不写LOG了,文件也不传输了,也就是好像跳出这个TIMER了,这是什么原因啊? 解决方案 解决方案二:异常处理了没.加trycatc

线程-sql 找错,一个很奇怪的错误

问题描述 sql 找错,一个很奇怪的错误 sql = "UPDATE bs2_dl_road_min SET count=count+{0} WHERE time='{1}' " "AND host_ip='{2}' AND module='{3}' AND method='{4}' AND status='{5}' " "AND size_level='{6}' AND level='{7}' AND submodule_road='{8}'"

Spring3.1整合Hibnerte4.1无法获取session错误,求指教!

问题描述 spring的配置文件<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org

解决无法从http://XXX/XXX.svc?wsdl获取元数据”错误

理解了文档内容,但无法进行处理.   - WSDL 文档包含无法解析的链接.   - 下载"http://admin-pc/IISHostService/Service1.svc?xsd=xsd0"时出错.   - 基础连接已经关闭: 接收时发生错误.   - 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接..   - 远程主机强迫关闭了一个现有的连接. 元数据包含无法解析的引用:"http://admin-pc/IISHostService/Service1.

MongoDB 写安全(Write Concern)

MongoDB Write Concern,简称MongoDB写入安全机制,是一种客户端设置,用于控制写入安全的级别.Write Concern 描述了MongoDB写入到mongod单实例,副本集,以及分片集群时何时应答给客户端.默认情况下,mongoDB文档增删改都会一直等待数据库响应(确认写入是否成功),然后才会继续执行.本文讲述了MongoDB 应答机制及相关参数. 一.MongoDB应答机制 MongoDB应答机制就是说对于当前数据库的写入成功与否告知客户端(db.getLastErr

java的线程死锁

由于线程可能进入堵塞状态,而且由于对象可能拥有"同步"方法--除非同步锁定被解除,否则线程不能访问那个对象--所以一个线程完全可能等候另一个对象,而另一个对象又在等候下一个对象,以此类推.这个"等候"链最可怕的情形就是进入封闭状态--最后那个对象等候的是第一个对象!此时,所有线程都会陷入无休止的相互等待状态,大家都动弹不得.我们将这种情况称为"死锁".尽管这种情况并非经常出现,但一旦碰到,程序的调试将变得异常艰难. 就语言本身来说,尚未直接提供防

java-JAVA中多线程stop() 和 suspend()方法为何不推荐使用?

问题描述 JAVA中多线程stop() 和 suspend()方法为何不推荐使用? 有一道JAVA面试题如题目所写,网上答案是这么写的, 反对使用 stop(),是因为它不安全.它会解除由线程获取的所有锁定,而且如果对象处于一 种不连贯状态,那么其他线程能在那种状态下检查和修改它们.结果很难检查出真正的问题 所在.suspend()方法容易发生死锁.调用 suspend()的时候,目标线程会停下来,但却仍 然持有在这之前获得的锁定.此时,其他任何线程都不能访问锁定的资源,除非被"挂起"

深入解析C++编程中线程池的使用_C 语言

为什么需要线程池目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短. 传 统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务.任务执行完毕后,线程退出,这就是是"即时创建,即 时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于 不停的创建线程,销