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。结果,数据库链接好像也被关闭了,嘿嘿,难道是操作系统弄的还是数据库客户端来关的?还是未搞懂线程释放的话线程内资源是如何释放的!
  • 相关阅读:
    数据库连接池
    数据库操作
    cookie/session
    楼梯问题
    Response/Request
    Web
    Exception
    jQuery效果与事件方法
    jQuery基础知识点
    布局的几种形式
  • 原文地址:https://www.cnblogs.com/enli/p/1230273.html
Copyright © 2011-2022 走看看