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。结果,数据库链接好像也被关闭了,嘿嘿,难道是操作系统弄的还是数据库客户端来关的?还是未搞懂线程释放的话线程内资源是如何释放的!
  • 相关阅读:
    JS通过组装key值访问json对象中的值
    js属性对象的hasOwnProperty方法
    ES6 去掉已经 new Date().format 方法
    Ajax不能接受php return值的原因
    CentOS最常用命令及快捷键整理
    js中for循环中需要调用异步方法,怎么确保执行的顺序?
    MYSQL 更新字段,向字段追加字符串
    java-学习2
    java-学习1
    JS----贪吃蛇游戏
  • 原文地址:https://www.cnblogs.com/enli/p/1230273.html
Copyright © 2011-2022 走看看