0

私は Indy 10.5 といくつかの古いバージョンを何年も使用していました。HTTP ダイジェスト認証をサポートするために、SVN から最新バージョンをダウンロードしました。

これは、私が抱えていた HTTP ダイジェスト認証の問題を修正しています...

問題は、10.6 以降のすべてのバージョンでの CPU 使用率です。

HTTP ストリーム (正確にはネットワーク カメラ MJPEG ストリーム) を取得するために 20 のスレッドを並行して作成できましたが、解像度とフレーム レートに応じて、タスクごとに約 1 ~ 3% の CPU を使用していました。(解析とデコードを含む)

通常は IOHandler、CookieManager を使用し、InternalWork メソッドに依存するコードをクリーンアップして、次のような idHttp の最も基本的な使用法が残るまで:

procedure TForm1.Button1Click(Sender: TObject);
var
    HTTPClient : TidHTTP;
begin
  HTTPClient := TidHTTP.Create(nil);
  HTTPClient.Get('http://plazacam.studentaffairs.duke.edu/axis-cgi/mjpg/video.cgi?resolution=640x480');
  HTTPClient.Free();
end;

また、設定を変更しない上記のコードでも、CPU の 25% を消費しています (そのため、コンピューターの 1 コアが飽和状態になります)。

これは無限ストリームであるため、クライアントに返されないのは正常ですが、ストリームはおそらく < 100kb/s であるため、それを取得するための CPU 使用率はゼロに近いはずです...

ドイツ語の別のフォーラムで、この HTTPOptions を追加すると高 CPU の問題が解決する可能性があることを読みましたが、私の場合は CPU には影響しません: HTTPOptions := [hoNoParseMetaHTTPEquiv]

Indy SVN の以前のリリースを試して、デイリー ビルドに固有のものではないことを確認しました。

XE4、XE5、および X6 に同梱されている 10.6.0 バージョンにも同じ問題がありますが、ロールバックすると: Indy 10.5.5 - RS2010 RTM

その後、すべてがうまくいき(HTTPダイジェスト認証を除く)、CPUの約2%しか使用しません...

誰かが同じことに遭遇し、現在のバージョンの indy がこれを行うために妥当な量の CPU を使用する方法を持っていますか?

ありがとうございました!

4

1 に答える 1

2

あなたが何をしているのか考えてみてください。TIdHTTP.Get()を返すのバージョンを呼び出してStringいますが、「無限」ストリームをダウンロードしています。つまりGet()、ソケットから常にデータを読み取り、最終的にデータを に変換することを見越して、そのデータを保持するためにより多くのメモリを割り当てますString。したがって、CPU 使用率が時間の経過とともに高くなる可能性があることは理にかなっています。特に、複数のスレッドで複数の作業を行う場合はそうです。

テストとして、Get()ダウンロードしたデータをメモリにバッファリングする代わりに破棄するように指示してみて、CPU 使用率がどのようになるかを確認してください。

HTTPClient.Get('http://plazacam.studentaffairs.duke.edu/axis-cgi/mjpg/video.cgi?resolution=640x480', TStream(nil));

TIdHTTPTStream「無限」データを受信できる を提供しない限り ( などTIdEventStream)、「無限」ストリームを処理するように設計されていないhoNoReadMultipartMIMEか、サーバーがストリーミング データを配信するために MIME を使用している場合はフラグを有効にします。このブログ記事で説明されているように、ストリーミング データを自分で作成します。

新しい TIdHTTP hoNoReadMultipartMIME フラグ

于 2014-08-23T16:37:55.243 に答える