以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  程序每隔一段时间自动假死  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=41402)

--  作者:wuxianzuoji41
--  发布时间:2013/10/18 15:23:00
--  程序每隔一段时间自动假死
窗口中timer加入了如下代码
ipa=Functions.Execute("GetNetIP")
If ipa<>ipb Then
Dim m As New MailSender
m.Host = "smtp.189.cn"
m.Account = "133100"
m.Password = "abc12345"
m.From = "1331100@189.cn"
m.AddReceiver("133800@189.cn")
m.AddReceiver("133100@189.cn")
m.Title = "ip" & Functions.Execute("GetNetIP")
m.C
m.SendAsync()
Else 
End If
ipb=ipa

就是自动吧IP变化发到指定邮件里。但是当执行这个程序的时候程序就无法操作其他程序了。可以单独弄一个线程处理这个吗,这个该怎么编写

[此贴子已经被作者于2013-10-18 15:25:32编辑过]

--  作者:狐狸爸爸
--  发布时间:2013/10/18 15:25:00
--  

不是有个ip变化就会触发的事件吗,你可以在这个事件写代码,不用定时执行的。

http://www.foxtable.com/help/topics/2710.htm

 


--  作者:Bin
--  发布时间:2013/10/18 15:26:00
--  
SendAsync 就是异步发送了啊.

是不是你Functions.Execute("GetNetIP") 里面的操作太繁琐耗时了?

--  作者:wuxianzuoji41
--  发布时间:2013/10/18 15:28:00
--  
狐狸爸爸这个可以检测外网IP变化吗,我是通过路尤器上网,我测试了好像不行。


--  作者:wuxianzuoji41
--  发布时间:2013/10/18 15:29:00
--  
bin,我引用的是muhua的“狐表信息管理系统 ”里的那个GetNetIP函数,我登录时候也调用这个函数挺快的,但是放在TIMER里的时候大概要假死个20-40秒左右,又自动恢复正常

On Error Resume Next
Dim httpURL As New System.Uri("http://ip.qq.com/")
Dim httpReq As System.Net.HttpWebRequest = System.Net.WebRequest.Create(httpURL)
httpReq.Method = "GET"
Dim httpResp As System.Net.HttpWebResponse = httpReq.GetResponse()
httpReq.KeepAlive = False
Dim reader As New IO.StreamReader(httpResp.GetResponseStream, System.Text.Encoding.GetEncoding(-0))
Dim respHTML As String = reader.ReadToEnd()
With CreateObject("vbscript.regexp")
    .Global = True
    .MultiLine = True
    .ignorecase = True
    \'.Pattern = ".*?\\<.*?\\>([^<>]+)[\\s\\S]*?"
    .Pattern = "当前的IP为.*?\\<.*?\\>([^<>]+)[\\s\\S]*?IP所在地为.*?\\<.*?\\>([^<>]+)"
    If .test(respHTML) Then
        With .Execute(respHTML)(0)
            Return Replace(.submatches(0), "&nbsp;", " ")
        End With
    End If
End With
Functions.Execute("GetNetIP")
bin 说的对,我自己也估计是这个函数时间比较长,有的时候,有什么好的解决方法吗
[此贴子已经被作者于2013-10-18 15:31:08编辑过]

--  作者:Bin
--  发布时间:2013/10/18 15:38:00
--  
呵呵,这个是从网络获取的,网速有问题或者网站服务器慢的时候自然就会卡死了.无解!  当然你要使用多线程也是可以的,狐表用起来比较麻烦,我之前是搞C# 的.VB.net的多线程还不是很熟悉.
--  作者:有点甜
--  发布时间:2013/10/18 20:07:00
--  
 获取的时候,还是挺快的说。代码放到计划任务那里,就是多线程了哦,不会假死的吧?
--  作者:程兴刚
--  发布时间:2013/10/18 20:31:00
--  

我的做法:增加一个全局变量,比如叫做:网络状态

 

NetworkAddressChanged事件代码:

 

Vars("网络状态") = TryConnectHost(www.jinyt.com)

 

BeforeLoadOuterTable事件代码:

 

If TryConnectHost("www.jinyt.com") = False Then
    e.Cancel = True
    MessageBox.show("对不起,当前网络或服务器不可用,请稍后再加载数据!")
End If

 

本事件代码,确保了在连接外部数据表的时候,如果网络不通,则暂时不连接,项目启动后,可以通过进入模块的代码再重新动态加载外部数据表,当服务器不可用时,继续忽略动作,不会链接。


【注】:本事件不能用全局变量,系统启动时全局变量还没有生成,会导致系统错误打不开。

 

BeforeSaveProject事件代码:

If Vars("网络状态") = False
    e.Cancel = True
    MessageBox.show("对不起,当前网络或服务器不可用,请稍后再保存数据!")
End If

 

这个事件的代码,保证了在保存项目之前,如果网络不通,将自动禁止不保存,也就不会报错了。

 

 

采用这种方法的优点:全局变量的值就是您想要知道的网络是否可用,您没有必要不断地采用定时器去检查服务器是否可用,因为那样做,是需要占用时间的,计划或窗口定时器过于繁重的代码或检测远程服务器是否可用,是会导致系统出现卡顿现象的!


--  作者:lsy
--  发布时间:2013/10/30 9:11:00
--  

顶程老师。


--  作者:Bin
--  发布时间:2013/10/30 9:23:00
--  
好主意! 顶