回 帖 发 新 帖 刷新版面

主题:[讨论]上网计时器算法的优化

关于上网计时器,比如“计时提醒王”这样的软件,我考虑了很长时间,但有些问题还是没想明白:

1、程序究竟是如何获得网络连接状态的(比如使用ADSL上网,关键是如何确定何时连接到了Internet,何时又断开了网络)

2、程序是如何实现系统时间被突然更改后仍能正常工作的(我的想法是只要用Timer控件计时,不用考虑系统时间就可以了,但是程序是要检查系统时间的,不知道这里边究竟有什么玄机)

关于以上两个问题,我的第一想法是用Timer控件不断刷新(比如不停地扫描网络状态)都可以实现,但问题是如果我把刷新时间改为1秒钟1次,岂不是很占用资源?

希望大家讨论一下,最好能附上源码~以方便交流

找到几个API,效率有没有区别,以及占用资源多少

发出两个API,也算资源共享了

Private Const INTERNET_CONNECTION_CONFIGURED = &H40
  Private Const INTERNET_CONNECTION_LAN = &H2
  Private Const INTERNET_CONNECTION_MODEM = &H1
  Private Const INTERNET_CONNECTION_OFFLINE = &H20
  Private Const INTERNET_CONNECTION_PROXY = &H4
  Private Const INTERNET_RAS_INSTALLED = &H10
  Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Long, ByVal dwReserved As Long) As Long

Dim Ret As Long
          Me.AutoRedraw = True

 InternetGetConnectedState Ret, 0&
    'show   the   result
    If (Ret And INTERNET_CONNECTION_CONFIGURED) = INTERNET_CONNECTION_CONFIGURED Then Label1.Caption = "连接有效" Else Label1.Caption = "连接无效"
    If (Ret And INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN Then Label2.Caption = "局域网"
    If (Ret And INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM Then Label2.Caption = "调制解调器"
    If (Ret And INTERNET_CONNECTION_OFFLINE) = INTERNET_CONNECTION_OFFLINE Then Label4.Caption = "离线"
    If (Ret And INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY Then Label5.Caption = "代理"
    If (Ret And INTERNET_RAS_INSTALLED) = INTERNET_RAS_INSTALLED Then Label6.Caption = "远程访问服务"

==========================================
'Example created by Tolis Bekiaris (tolisss@hotmail.com)
Private Declare Function RasEnumConnections Lib "rasapi32" Alias "RasEnumConnectionsA" (ByVal lprasconn As Long, ByVal lpcb As Long, ByVal lpcConnections As Long) As Long
Private Declare Function RasGetConnectionStatistics Lib "rasapi32" (ByVal hRasConn As Long, ByVal lpStatistics As Long) As Long
Private Type RASCONN
    dwSize As Long
    hRasConn As Long
    szEntryName(0 To 256) As Byte
    szDeviceType(0 To 16) As Byte
    szDeviceName(0 To 128) As Byte
    pad As Byte
End Type
Private Type RAS_STATS
    dwSize As Long
    dwBytesXmited As Long
    dwBytesRcved As Long
    dwFramesXmited As Long
    dwFramesRcved As Long
    dwCrcErr As Long
    dwTimeoutErr As Long
    dwAlignmentErr As Long
    dwHardwareOverrunErr As Long
    dwFramingErr As Long
    dwBufferOverrunErr As Long
    dwCompressionRatioIn As Long
    dwCompressionRatioOut As Long
    dwBps As Long
    dwConnectDuration As Long
End Type
Private Sub Form_Load()
    Dim conn As RASCONN
    Dim stat As RAS_STATS
    Dim y As Long, z As Long
        
    conn.dwSize = Len(conn)
    y = conn.dwSize
    
    
    If RasEnumConnections(VarPtr(conn), VarPtr(y), VarPtr(z)) = 0 Then
        stat.dwSize = Len(stat)
        If RasGetConnectionStatistics(conn.hRasConn, VarPtr(stat)) = 0 Then
            Debug.Print stat.dwAlignmentErr
            Debug.Print stat.dwBps
            Debug.Print stat.dwBufferOverrunErr
            Debug.Print stat.dwBytesRcved
            Debug.Print stat.dwBytesXmited
            Debug.Print stat.dwCompressionRatioIn
            Debug.Print stat.dwCompressionRatioOut
            Debug.Print stat.dwConnectDuration
            Debug.Print stat.dwCrcErr
            Debug.Print stat.dwFramesRcved
            Debug.Print stat.dwFramesXmited
            Debug.Print stat.dwFramingErr
            Debug.Print stat.dwTimeoutErr
        End If
    End If
    
End Sub

回复列表 (共14个回复)

沙发

呵呵,现在的宽带一般是包月的了,有计时的必要吗?

板凳

[quote]呵呵,现在的宽带一般是包月的了,有计时的必要吗?[/quote]

当然有啊,我在学校,用201上网卡

3 楼

网络连接API拦截,连接成功计时开始,timer也可以啊,怎么会很占用资源,那是回调啊~

原理都是操作系统,没什么神秘也没什么玄机~~

4 楼

[quote]网络连接API拦截,连接成功计时开始,timer也可以啊,怎么会很占用资源,那是回调啊~

原理都是操作系统,没什么神秘也没什么玄机~~[/quote]

网络连接API拦截是什么意思?跟Timer不一样么?麻烦您详细说说,谢谢!

另外,我说的是为什么要检查系统时间

5 楼

你说的Timer是计时检测啊,那当然费时了...

想办法在系统网络发生变化时主动通知你的程序,OS告诉你,呃,'已经连上网了',或者是'已经断开了'...

6 楼

[quote]你说的Timer是计时检测啊,那当然费时了...

想办法在系统网络发生变化时主动通知你的程序,OS告诉你,呃,'已经连上网了',或者是'已经断开了'...[/quote]

嗯,其实我想到过这个思路,但实在不知道如何实现,请高手们帮忙啊

7 楼

用托盘图标和提示窗口就行了吧!~

8 楼

[quote]
用托盘图标和提示窗口就行了吧!~
[/quote]

什么意思?

9 楼

= =;看来我有"不看问题就回答的习惯orz"
我说的是提示界面的设计问题.

个人还是认为用计时器好.要不就用空闲信息来进行时时监控.

10 楼

[quote]
个人还是认为用计时器好.要不就用空闲信息来进行时时监控.
[/quote]

为什么啊?

我来回复

您尚未登录,请登录后再回复。点此登录或注册