主题:[讨论]上网计时器算法的优化
关于上网计时器,比如“计时提醒王”这样的软件,我考虑了很长时间,但有些问题还是没想明白:
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
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