zoukankan      html  css  js  c++  java
  • DEPHI的TThread类拾遗

    最近发现以前写的代码里面TThread日志不完全,老是缺线程关闭的日志.研究了一下,发现是以前对线程理解有误,参见了一下Delphi下的Tthread代码
    function ThreadProc(Thread: TThread): Integer;
    var
      FreeThread: Boolean;
    begin
    {$IFDEF LINUX}
      
    if Thread.FSuspended then sem_wait(Thread.FCreateSuspendedSem);
    {$ENDIF}
      
    try
        
    if not Thread.Terminated then
        
    try
          Thread.Execute;
        except
          Thread.FFatalException :
    = AcquireExceptionObject;
        end;
      
    finally
        FreeThread :
    = Thread.FFreeOnTerminate;
        Result :
    = Thread.FReturnValue;
        Thread.DoTerminate;
        Thread.FFinished :
    = True;
        SignalSyncEvent;
        
    if FreeThread then Thread.Free;
    {$IFDEF MSWINDOWS}
        EndThread(Result);
    {$ENDIF}
    {$IFDEF LINUX}
        
    // Directly call pthread_exit since EndThread will detach the thread causing
        
    // the pthread_join in TThread.WaitFor to fail.  Also, make sure the EndThreadProc
        
    // is called just like EndThread would do. EndThreadProc should not return
        
    // and call pthread_exit itself.
        if Assigned(EndThreadProc) then
          EndThreadProc(Result);
        pthread_exit(Pointer(Result));
    {$ENDIF}
      end;
    end;

    从这里看出,其实TThread类是调用BeginThread来实现的,而线程关闭的时候(无论是Destroy或者OnTerminate)其实是调用了主线程来处理关闭方法的.所以以往在主线程CLOSE的时候来记录线程释放的日志基本上会不成功.嘿嘿.所以以后关闭程序前要读个秒表来个LOAD过程

    这里联想到,以往写的代码里面有很多线程释放的时候再来释放数据库链接、释放类实例,貌似都执行不到的(也可能是DEBUG不到)。做了一下试验,在Thread里面加了几个数据库链接,然后没有在Thread的Destroy里面CLOSE链接就直接释放Thread。结果,数据库链接好像也被关闭了,嘿嘿,难道是操作系统弄的还是数据库客户端来关的?还是未搞懂线程释放的话线程内资源是如何释放的!
  • 相关阅读:
    剑指Offer 30 包含min函数的栈
    剑指Offer 29 顺时针打印矩阵
    剑指Offer 27 二叉树的镜像
    13张动图助你彻底看懂马尔科夫链、PCA和条件概率!
    一位ML工程师构建深度神经网络的实用技巧
    IBM沃森会成为第一个被抛弃的AI技术吗?
    中国最强AI超级服务器问世,每秒提供AI计算2000万亿次
    SAP WM 有无保存WM Level历史库存的Table?
    SAP MM 按采购订单查询付款信息的报表?
    机器学习项目失败的9个原因
  • 原文地址:https://www.cnblogs.com/enli/p/1230273.html
Copyright © 2011-2022 走看看