首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dbExpress时FreeLibrary冻结(TSQLConnection)

使用dbExpress时FreeLibrary冻结(TSQLConnection)
EN

Stack Overflow用户
提问于 2015-11-13 00:54:47
回答 1查看 236关注 0票数 0

我目前正在开发一些简单的自动更新应用程序。最重要的特性是自我更新的可能性。这就是为什么我计划把大部分逻辑放在外部DLL中。在我的动态链接库增长了一点之后,我开始在主应用程序中使用FreeLibrary调用时遇到问题。在dll调试期间,我发现了导致该错误的函数:

代码语言:javascript
复制
function TpmDSServerUpdateDownloader.DownloadUpdates: Boolean;
var
  LSQLConnection: TSQLConnection;
  LSQLServerMethod: TSqlServerMethod;
  LUpdatePackageLink: string;
begin
  try
    {$IFDEF DEBUG}
    Sleep(10000);
    {$ENDIF}
    // Getting update package link
    FUpdateServerIP := '127.0.0.1';
    FUpdateServerPort := 8080;
    LSQLConnection := TSQLConnection.Create(nil);
    LSQLServerMethod:= TSQLServerMethod.Create(nil);
    LSQLConnection.DriverName :='DataSnap';
    LSQLConnection.LoginPrompt := False;
    LSQLConnection.Params.Add('CommunicationProtocol=HTTP');
    LSQLConnection.Params.Add('Hostname=' + FUpdateServerIP);
    LSQLConnection.Params.Add('Port=' + IntToStr(FUpdateServerPort));
    LSQLConnection.Params.Add('ConnectTimeout=' + IntToStr(10000));
    LSQLConnection.Connected := True;
    LSQLServerMethod.SQLConnection:= LSQLConnection;
    LSQLServerMethod.ServerMethodName:= 'TServerMethods1.GetUpdatePackageLink';
    LSQLServerMethod.Params[0].AsInteger := 1;
    LSQLServerMethod.ExecuteMethod;
    LUpdatePackageLink := LSQLServerMethod.Params[1].AsString;
    // Downloading update package with LUpdatePackage link
  finally
    LSQLConnection.Connected := False;
    LSQLServerMethod.Free;
    FreeAndNil(LSQLConnection);
  end;
end;

当我使用该函数中的dbExpress组件时,问题出现了。我想知道释放TSQLConnection/TSQLServerMethod是否会留下一些像IBObjects中的SQLMonitor一样工作的dbExpress线程/对象。也许你有一些想法来解决这个问题?如果能帮上忙,我将非常感激。

问候Michal

EN

回答 1

Stack Overflow用户

发布于 2018-12-20 17:22:46

这是一个Delphi错误。

然而,有一个解决方案:

下面的微软关闭线程不能从DLL unload中调用,因此在TDBXScheduler的TThread.WaitFor进程中的WaitForMultipleObject无限循环上的FreeLibrary freez是在Data.DBXCommon的初始化部分中创建的,并将在该单元的finialization部分中自动关闭。这就产生了错误。所以我们必须早点关闭这个线程。

解决方案是,您需要导出新过程并在FreeLibrary之前调用它:

代码语言:javascript
复制
   uses 
       Data.DBXCommon
    .....
    procedure FinishDLLWork; stdcall; export;
    begin
      TDBXScheduler.Instance.Free;
    end;

在FreeLibrary之前调用它;在释放TDBXScheduler.Instance时,TDBXScheduler会自动将它设置为Nil,所以这个调用没有问题(请检查TDBXScheduler.Destroy;)

不幸的是,不能在DLL_THREAD_DETACHDLL_PROCESS_DETACH中调用它-为时已晚。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33676974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档