WinInetでメモリが


ss  2008-06-18 08:29:58  No: 31010

いつもお世話になります。
以下のコードで、サーバーからHttpで時刻を取ってくるようにした
のですが、1スレッドのはずが6か7スレッドで動作し、メモリ使用
量が4M弱から70M程度に増加していました。
他のソフトで付加がかかった時動作が重くなるので、
メモリ使用量を減らせる方法か?他の方法でhttpで時間取得する方法
はないでしょうか?
尚、LANがつながっていない特はNOWで時間を取ってくるようにしています。
よろしくお願いします。
ses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
  StdCtrls, OneInstance, ShellAPI, WinInet, DateUtils, ExtCtrls;
以下省略
function GetMyServerTime : TDateTime ;
  const
  //   Httpで時間取得するサーバー名
       URL = 'http://10.1.1.101/';

var
  InetHandle, IOpenHandle: HINTERNET;
  Buffer: array[0..255] of Char;
  BufSize, Dummy: Cardinal;
  Y, M, D, H, N, S: Word;
  MStr: String;
  HttpDateTime: TDateTime;

begin
   Result := Now;
  InetHandle := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    if (not Assigned(InetHandle)) then begin
    Exit;
    end;
    IOpenHandle := InternetOpenUrl(InetHandle, URL, nil, 0, INTERNET_FLAG_RELOAD, 0);
    try
      if (not Assigned(IOpenHandle)) then begin
          Exit;
      end;
      BufSize := Length(Buffer);
      FillChar(Buffer, BufSize, 0);
      Dummy := 0;
      if HttpQueryInfo(IOpenHandle, HTTP_QUERY_DATE, @Buffer, BufSize, Dummy) then
      begin
        Y := StrToIntDef(Copy(Buffer, 13, 4), 0);
        MStr := LowerCase(Copy(Buffer, 9, 3));
        if (MStr = 'jan') then M := 1 else
        if (MStr = 'feb') then M := 2 else
        if (MStr = 'mar') then M := 3 else
        if (MStr = 'apr') then M := 4 else
        if (MStr = 'may') then M := 5 else
        if (MStr = 'jun') then M := 6 else
        if (MStr = 'jul') then M := 7 else
        if (MStr = 'aug') then M := 8 else
        if (MStr = 'sep') then M := 9 else
        if (MStr = 'oct') then M := 10 else
        if (MStr = 'nov') then M := 11 else
        if (MStr = 'dec') then M := 12 else
        M := 0;
        D := StrToIntDef(Copy(Buffer, 6, 2), 0);
        H := StrToIntDef(Copy(Buffer, 18, 2), MAXWORD);
        N := StrToIntDef(Copy(Buffer, 21, 2), MAXWORD);
        S := StrToIntDef(Copy(Buffer, 24, 2), MAXWORD);

        // なぜか世界標準時が返されるので、  Hに  +9時間としている。

        if TryEncodeDateTime(Y, M, D, H + 9, N, S, 0, HttpDateTime) then
            Result := HttpDateTime
        else
            Result := now;
      end;
    finally
      InternetCloseHandle(IOpenHandle);
    end;
  finally
    InternetCloseHandle(InetHandle);
end;
end;


もにゃ  2008-06-18 18:58:28  No: 31011

何をしたいのかがわかりません。
HTTP_QUERY_DATE:メッセージの作成時刻。 
らしいですよ。
ググったらサンプル付きで出てきました。
http://nienie.com/~masapico/api_HttpQueryInfo.html

※タイムサーバーに接続して標準時刻を得ようということではないのですよね?(だとすると全く違いますよ。)


KHE00221  2008-06-19 00:05:56  No: 31012

この手のプログラムはサーバーが返すまでに時間がかかり
その間固まるのでGetMyServerTime をスレッドから呼び出してるのかな?

だとすると
>1スレッドのはずが6か7スレッドで動作し

はGetMyServerTimeではなく、そのスレッドの問題だと思うんだけど?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加