请问,我想做一个小程序来统计用户上机的时间,每当开机1小时后就提示一下,和每当上网一小时提示一下,还有每当整点时提示一下,怎么去捕捉这些时间呢?还要求不影响其它程序的运行,不要占过多的系统资源。请给个思路好吗?我很想知道是怎么在这些时间时自动被程序捕到,总不到做个TIMER一直不停去监测吧?还是通过WIN消息呢?整点触发也有消息?请明示!高分求解

解决方案 »

  1.   

    每当上网一小时提示一下检测计算机是否联网比较简单的做法可以通过一个 Win32 Internet(WinInet) 函数 InternetCheckConnection来实现;这个函数的功能是检查是否能够建立 Internet 连接。它的实现是在 %SystemRoot%\System32\wininet.dll 中,Delphi 调用声明在 WinInet.pas 中,其 API 声明如下:BOOL InternetCheckConnection(  IN LPCSTR lpszUrl,  IN DWORD dwFlags,  IN DWORD dwReserved);参数的意义是:lpszUrl: 需要测试能否建立连接的 URL 地址,可以为空;dwFlags: 目前只能是 FLAG_ICC_FORCE_CONNECTION(这个常量 Delphi 中没有声明,其值为 $00000001);dwReserved: 目前只能为 0。调用的说明:如果 lpszUrl 是非空的,Windows 从中解析出 Host 名然后 Ping 这个指定的 Host。如果 lpszUrl 是空的,并且 WinInet 内部服务器的 database 中有一个关于最近的 Server 的纪录,Windows 就从这条纪录中解析出 Host 名然后 Ping 它。如果能够成功的连接返回 True,否则返回 False;以下是一个判断当前计算机是否联网的例子:procedure TForm1.Button1Click(Sender: TObject);begin  if InternetCheckConnection('http://www.yahoo.com/', 1, 0) then  edit1.text:= 'Connected'  else  edit1.text:= 'Disconnected';end;通过上述的方法只能检测出当前计算机是否物理联网,即网线是否接好,网卡是否能顺利工作,不能确定是否能够实现获得 Internet 服务,即是否能和 ISP 进行 Internet 连接。这时可以通过另一个 Win32 Internet(WinInet) 函数 InternetQueryOption 来检测;这个函数的功能是查询指定 Internet 句柄的状态、选项。其 API 声明如下:BOOL InternetQueryOption(  IN HINTERNET hInternet,  IN DWORD dwOption,  OUT LPVOID lpBuffer,  IN OUT LPDWORD lpdwBufferLength);参数的意义是:hInternet:查询对象的 Internet 句柄(全局查询时为 nil),dwOption:查询的项目;lpBuffer:返回的查询结果;lpdwBufferLength:查询结果的字节长度(包括 IN 和 OUT);查询成功返回 True,否则返回 False;我们要查询当前计算机的 Internet 连接状态时可以使用查询项目 INTERNET_OPTION_CONNECTED_STATE,得到的 ConnectState 返回值可能是以下值的一个或几个值之和:INTERNET_STATE_CONNECTED :$00000001 连接状态;INTERNET_STATE_DISCONNECTED :$00000002 非连接状态(和 INTERNET_STATE_CONNECTED 对应);INTERNET_STATE_DISCONNECTED_BY_USER :$00000010 用户请求的非连接状态INTERNET_STATE_IDLE :$00000100 连接状态,并且空闲INTERNET_STATE_BUSY :$00000200 连接状态,正在响应连接请求以下是一个判断当前计算机是否可以获得 Internet 服务的例子:function TForm1.CheckOffline: boolean;var  ConnectState: DWORD;  StateSize: DWORD;begin  ConnectState:= 0;  StateSize:= SizeOf(ConnectState);  result:= false;  if InternetQueryOption(nil, INTERNET_OPTION_CONNECTED_STATE, @ConnectState, StateSize) then  if (ConnectState and INTERNET_STATE_DISCONNECTED) <> 2 then result:= true;end;procedure TForm1.Button1Click(Sender: TObject);begin  if CheckOffline then  edit1.text:= 'Connect To ISP'  else  edit1.text:= 'Disconnect To ISP';end;需要说明的是 InternetQueryOption 函数的检测结果只能表明当前的 Internet 设置是可用的,并不能表示计算机一定能访问 Internet,例如网线掉了,网卡突然坏了之类的错误就没法检测出来,要想检测当前计算机是否能够获得 Internet 服务了必须两个函数结合起来使用。以上程序在 Win2000, Delphi5.0 下调试通过。最后要提醒大家注意的是在 uses 中要加上 WinInet。对于 Windows 2000 中网络掉线的实时检测,猜想是和底层的中断或者某个 Service 有关.自己记时就行了
      

  2.   

    取得自从开机到现在CPU运行的周期数,超毫秒级的精度
    function Ticker: int64; register;
    var
      T                 : int64Rec;
    begin
      asm
        db $0f,$31
        mov [T.Lo],EAX
        mov [T.Hi],EDX
      end;
      Result := int64(T);
    end;****************************************const
      D32               = $66;function RDTSC: comp;
    var
      TimeStamp         : record
        case byte of
          1: (Whole: comp);
          2: (Lo, Hi: LongInt);
      end;
    begin
      asm
            db $0F; db $31;                        {BASM doesn't support RDTSC}
            {Pentium RDTSC - Read Time Stamp Counter - instruction}
    {$ifdef Cpu386}
            mov        [TimeStamp.Lo],eax        // the low dword
            mov        [TimeStamp.Hi],edx        // the high dword
    {$else}
            db D32
            mov        word ptr TimeStamp.Lo,AX
            {mov [TimeStamp.Lo],eax - the low dword}
            db D32
            mov        word ptr TimeStamp.Hi,DX
            {mov [TimeStamp.Hi],edx - the high dword}
    {$endif}
      end;
      Result := TimeStamp.Whole;
    end;type
      CompStr = string[25];
      {Comps have up to 18 digits, plus commas, and sign}function CompToStr(N: comp): CompStr;
    var
      Low3              : string[3];
      N1                : extended;
    begin
      if N < 0 then
        Result := '-' + CompToStr(-N)
      else
      begin
        N1 := N / 1000;
        Str(Round(Frac(N1) * 1000), Low3);
        N := Int(N1);
        if N > 0
          then
        begin
          while Length(Low3) < 3 do
            Low3 := '0' + Low3;
          Result := CompToStr(N) + ThousandSeparator + Low3;
        end
        else
          Result := Low3
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
    //showmessage(inttostr( Ticker));
      memo1.Lines.Add(CompToStr(RDTSC));
      

  3.   

    其实对我的意思理解上可能有时有点不同吧。我的意思是问,统计上网的时间和每当上网一小时就提示一次是怎么监视的呢?我知道可以用来判断当前是否与网络是否连接,但我想知道是设一个TIMER组件每隔上1秒就检测一下呢?还是有什么好方法呢?比如说是用线程来跟踪呢?我感觉如果有一个TIMER组件每一秒就检测一次,是不是会大大降低系统速度呢?这是我最想知道的,如果没什么影响就好办了。这只是程序的一小部分,我可不想让我的程序太占资源啊!多谢大家帮助。我的水平非常低,所以有很多问题很白痴,所以大家忍着点啊:)