multithreading - Delphi:系统错误1158的原因(当前进程没有更多的系统句柄)

标签 multithreading delphi

应用程序长时间闲置后,当我单击表单时,它通常会崩溃。

我每天都会让它闲置,看看是否发现错误,最后今天早上我开始使用它,点击几次后我得到了:

系统错误 1158 当前进程已使用其句柄的所有系统余量

所以不知何故,我使用了所有资源,幸运的是,今天早上我开始使用该应用程序,当时它几乎耗尽了资源,我一直使用它,直到所有句柄不再可用。而在其他日子里,我来得太晚了,没有更多的 handle 可用(这正是我怀疑的)。当然,在这种情况下,当我点击应用程序时,应用程序崩溃了。

现在您能提出一个解决方案吗?我使用线程定期检查新消息或计算在线用户数量。但我仔细检查并在每个线程后释放了所有内容。 (但可能还有一些我不知道的关于线程的事情)。应用程序始终连接到数据库(我使用 DevArt SDAC),无论如何都没有断开连接,因为在断开连接的情况下我会收到警告并提示用户尝试重新连接。

最佳答案

您可以使用 GetProcessHandleCount 编写一个函数来监视应用程序的打开句柄。函数,然后调试您的应用程序并使用类似 OutputDebugString 的内容显示结果.

uses
  Windows,
  SysUtils;

function GetProcessHandleCount(hProcess: THandle; var pdwHandleCount: DWORD): BOOL;  stdcall; external 'Kernel32.dll' name 'GetProcessHandleCount';

function GetOpenHandles : DWORD;
begin
 if not GetProcessHandleCount(GetCurrentProcess,Result) then
     RaiseLastOSError;
end;

像这样使用

 OutputDebugString(PAnsiChar(IntToStr(GetOpenHandles)));
 Task1;
 OutputDebugString(PAnsiChar(IntToStr(GetOpenHandles)));
 Task2;
 OutputDebugString(PAnsiChar(IntToStr(GetOpenHandles)));
 Task3;
 OutputDebugString(PAnsiChar(IntToStr(GetOpenHandles)));

关于multithreading - Delphi:系统错误1158的原因(当前进程没有更多的系统句柄),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4966900/

相关文章:

java - run() 方法后线程继续运行

c# - 如何在 C# 和 Delphi 应用程序之间进行通信?

delphi - 如何在Delphi中实现引用计数对象

delphi - Firemonkey float 键动画,转到特定键

c# - 您可以强制 Parallel.Invoke 使用多线程吗?

c - 使用 OpenMP 进行 LU 分解似乎很慢,需要建议

php - MD5 文件哈希 - 将 Delphi 输出与 PHP md5_file 函数匹配

delphi - Delphi 中其他进程的 StackWalk?

java - 例如,在内部对象上“同步”。游戏循环.player1

multithreading - 我的代码中的随机访问违规