2

我们正在使用 Delphi 7 开发控制台软件。

为简化起见,该软件使用嵌入式 TCP 服务器来响应来自 CGI 的外部请求。这些答案包含生成的带有 Techart 图表的 HTML 页面,以及使用 DbExpress 从数据库中提取的数据。

在 Windows 7 和 Windows 2008 R2 服务器上,我们注意到我们的软件运行时间显着增加 - 是 Windows XP 或 Windows Server 2003 上原始处理时间的 2 或 3 倍 - 在标准执行环境中:作为服务启动的软件系统用户帐户。

但是,当我们的软件以简单用户身份、从命令提示符或直接从 IDE(调试模式)启动时,问题就消失了。

我的第一个问题是:有人已经注意到这个问题了吗?

使用 ProcessExplorer,我们还注意到当软件作为服务启动时,没有创建 GDI 句柄,也没有创建用户句柄。但是当使用用户帐户启动软件时,会创建其中一些句柄。在 Windows XP 和 Windows Server 2003 中,无论是软件作为服务启动还是使用简单的用户帐户启动,这些句柄总是被创建。

这个观察可以与我们的问题联系起来吗?

如果您已经注意到这些行为,您是如何解决问题的?

4

2 回答 2

2

由于我们在很多地方都依赖于 Windows API CompareString 函数,因此我们无法用非 Windows 版本替换它。但是,我们发现 API 工作正常,而不是通过使用 LOCALE_INVARIANT($07) 来使用 LOCAL_USER_DEFAULT。因此,我们决定破解 Windows 中定义的常量值,并在用于比较目的的任何地方重写它,并使用如下条件编译:

{$IFDEF OVERLOAD_LUD}
const
  LOCALE_INVARIANT = $7;
  LOCALE_USER_DEFAULT = LOCALE_INVARIANT;
{$ENDIF}

这解决了问题。

于 2013-01-06T05:32:31.850 回答
0

我想我们找到了问题的根源。因此,对于那些正在寻找解决方案的人,这就是我们所做的:

延迟是由于使用本地函数使用 Win32 API 函数。现在不推荐使用区域设置标识符函数,而支持使用区域设置名称函数(请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/dd319091%28v=vs.85%29.aspx)。

我们的开发大量使用“CompareString”(http://msdn.microsoft.com/en-us/library/windows/desktop/dd317759%28v=vs.85%29.aspx),包括使用 indexOf 方法TStringList 。当在用户上下文系统中运行时(在会话 0 中),此方法(内核 132 的 CompareStringA)的执行速度会减慢。

为了解决这个问题,我们用CompareStr 重载了TStringList 而不是CompareString。此解决方法适合我们的上下文,但 CompareStr 会逐位进行比较,并且与 CompareString 不同,它不区分大小写。(更不用说这种方法快了大约 10 倍...... http://www.gefvert.org/blog/archives/651

另一种解决方案是切换到更新版本的 IDE,但我们都知道这是另一个故事......

于 2012-09-27T07:18:14.103 回答