2

Delphi7を使用してコンソールソフトウェアを開発しています。

簡単にするために、このソフトウェアは組み込みTCPサーバーを使用してCGIからの外部要求に応答しています。これらの回答には、Teechartグラフを使用して生成されたHTMLページと、DbExpressを使用してデータベースから抽出されたデータが含まれています。

Windows7およびWindows2008R2サーバーでは、標準の実行コンテキストで、ソフトウェアの実行時間が大幅に増加していることに気付きました。これは、WindowsXPまたはWindowsServer 2003の元の処理時間の2〜3倍です。システムユーザーアカウント。

しかし、ソフトウェアを単純なユーザーとして、コマンドプロンプトから、またはIDE(デバッグモード)から直接起動すると、問題は単純に解消されます。

私の最初の質問は:誰かがすでにこの問題に気づいていますか?

ProcessExplorerを使用して、ソフトウェアがサービスとして起動されたときに、GDIハンドルが作成されておらず、ユーザーハンドルも作成されていないことにも気づきました。ただし、ソフトウェアをユーザーアカウントで起動すると、これらのハンドルの一部が作成されます。WindowsXPおよびWindowsServer2003では、ソフトウェアはサービスとして起動されるか、単純なユーザーアカウントで起動され、これらのハンドルは常に作成されます。

この観察は私たちの問題と関連することができますか?

これらの動作にすでに気付いている場合、どのようにして問題を修正しましたか?

4

2 に答える 2

2

Windows API の CompareString 関数に依存する場所が多かったため、Windows 以外のバージョンに置き換えることができませんでした。しかし、LOCALE_INVARIANT($07) を使用して LOCAL_USER_DEFAULT を使用する代わりに、API が正常に機能することがわかりました。そこで、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を参照)。 )。

私たちの開発は、 TStringList 。このメソッド (kernell32 の CompareStringA) の実行は、ユーザー コンテキスト システム (セッション 0) で実行中は遅くなります。

この問題を回避するために、CompareString の代わりに CompareStr を使用して TStringList をオーバーロードしました。この回避策は私たちのコンテキストに適していますが、CompareStr は少しずつ比較を行い、CompareString とは異なり大文字と小文字を区別しません。(この方法が約 10 倍高速であることは言うまでもありません... http://www.gefvert.org/blog/archives/651 )

別の解決策は、新しいバージョンの IDE に切り替えることですが、これは別の話であることは誰もが知っています...

于 2012-09-27T07:18:14.103 に答える