Foxtable(狐表)用户栏目专家坐堂 → [分享]项目自动升级的代码优化


  共有2895人关注过本帖树形打印复制链接

主题:[分享]项目自动升级的代码优化

帅哥哟,离线,有人找我吗?
shenyl0211
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
[分享]项目自动升级的代码优化  发帖心情 Post By:2016/11/17 19:52:00 [显示全部帖子]

敬请狐爸根据我的测试结果改进Syscmd.Project.Update命令。

帮助中的自动升级代码是这样的:
If Syscmd.Project.Update(False,False) = False Then '如果没有升级
Forms("窗口1").open()
'后续其它代码
End
If
在某种外网情况下,执行 Syscmd.Project.Update(False,False) 需要用时23秒(见下文)。

而我早期是自己编写自动升级代码的,直接用下列代码进行判断:
Dim s1 As Date = ftp1.GetFiletime(upath & datafile) '服务器上升级文件的日期时间
'在全局代码中定义: public ftp1 as FTPClient
upath & datafile为服务器上的升级路径和update.txt
在同样的外网情况下用时仅1秒。

下面是测试代码:
Output.show( Date.Now)
ftp1 = new FTPClient '全局代码中定义ftp1
ftp1.Host = IPa '全局代码中定义IPa
ftp1.Account = ftpaccount '全局代码中定义ftpaccount
ftp1.password = ftppassword '全局代码中定义ftppassword
ftp1.UTF8 = True '我的服务器需要设为true
Dim s1 As Date = ftp1.GetFiletime(upath & datafile) 
Output.show(s1)
Output.show(Date.Now)
Syscmd.Project.Update(False,False)
Output.show(Date.Now)

下面是项目刚启动时的第一次测试结果,我的方法用时1秒,而帮助中的方法用时23秒
2016-11-17 19:09:19
2016-11-17 16:29:09
2016-11-17 19:09:20
2016-11-17 19:09:43

下面是项目启动后的第二次测试结果,我的方法用时1秒,帮助中的方法用时竟大大缩短为1-2秒!!!
说明Syscmd.Project.Update第一次执行有问题。
2016-11-17 19:11:38
2016-11-17 16:29:09
2016-11-17 19:11:39
2016-11-17 19:11:41

下面是我改进后的全套代码,供参考:
'自动静默下载升级文件并更新
If ProjectFile <> dpath & pfile Then '非开发状态,dpath为开发文件所有路径,pfile为项目名称
    RemoteUpdate = True
    Dim s1 As Date = ftp1.GetFiletime(upath & datafile) '服务器上升级文件的日期时间
    If s1 > publishdate Then '如果较现在版本的日期时间新则下载并升级
        UpdatePath = "ftp://" & ftpAccount & ":" & ftppassword & "@" & IPa & upath
        Syscmd.Project.Update(False,False)
        Syscmd.Project.Exit(False)
        Return
    Else
        Forms("用户登录").Open()
    End If
Else
    Forms("用户登录").Open()
End If
[此贴子已经被作者于2016/11/17 19:53:24编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
shenyl0211
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2016/11/17 21:39:00 [显示全部帖子]

请楼上尊重几个事实:
    1、项目能正常运行,就说明外网是通的,无需Syscmd.Project.Update浪费时间判断。
    2、升级文件能正常上传,就说明升级地址是可以访问的,无需Syscmd.Project.Update浪费时间判断。
    3、FTP服务器与SQL数据库肯定在同一台服务器上,无需Syscmd.Project.Update浪费时间判断。
    以上3项是软件开发者该完成的事,而不是Syscmd.Project.Update的事。
    4、PublishDate要晚于update.txt文件的时间,就说明只要用getfiletime比较这两个时间就行了,而无需Syscmd.Project.Update先下载update.txt,再从update.txt中提取数据进行时间判断。
 所以,Syscmd.Project.Update仍然在浪费时间。
    5、只有PublishDate早于update.txt文件的时间时,才需要更新,所以,我仅在这时候使用Syscmd.Project.Update,让Syscmd.Project.Update判断需要进行什么样的升级。所以,我没有额外的下载代码。
    6、不是每次运行都需要升级或都有升级,所以,我的方法是最节省时间的。因为仅1秒,所以也不需要用专门的计划管理在后台进行版本检测。而Syscmd.Project.Update不仅越俎代庖,而且方法不对,从而导致浪费大量时间。外网用户每次启动都要延长22秒,能承受吗?

[此贴子已经被作者于2016/11/17 21:44:24编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
shenyl0211
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2016/11/18 9:11:00 [显示全部帖子]

回5楼:
    1、在Syscmd.Project.Update出来之前,每个开发者都用自己的代码进行自动升级,我也不例外,还在论坛分享了我的全自动升级代码。
    2、我承认,“Foxtable的目的之一就是想替代开发者做更多本应开发者做的事情”,比如Syscmd.Project.Update就代替了很多代码。但3楼所说的前3项确实不是foxtable的事,而是开发者的事。例如:
    3楼的第1条,项目刚刚全部打开才几秒钟,你就认为网络可能不通而需要重新判断。那么,就算你判断的时候是通的,难道你不怀疑下载的时候又断了吗?所以,判断网络是否连通不是Syscmd.Project.Update的事,也没必要
    3楼的第2条,如果升级地址是错的,开发者测试的时候就会发现,亦即下列代码中,s1=00:00:00,而不会是实际的update.txt的日期和时间。
    Dim s1 As Date = ftp1.GetFiletime(upath & datafile) 
    Output.show(s1)
    现在的问题是,Foxtable并没有考虑项目的使用者同时有外网和内网用户,所以,整个帮助文档只单独谈局域网怎么设置或互联网怎么设置,而通过看论坛,根本无需按照帮助文档在项目属性和列属性中作任何设置,用代码就可以解决了。可惜Foxtable作了大量的讲解,却没有合适的代码。比如对3楼提到的 UpdatePath = "ftp://" & ftpAccount & ":" & ftppassword & "@" & IPa & upath,帮助文档根本没有例子,一切都让用户写到属性里。可是IP地址有内网IP1和外网IP2两个,填哪个?但用代码就很简单:先赋值IPa=IP1,再ping内网IP1,ping不通就赋值IPa=IP2。这是局域网和互联网的唯一区别。
    3、由3楼的第4条和1楼的例子可知,update.txt只需要保存foxtable的版本日期即可。
    4、项目进程映象名称的日期实际上就是foxtable.exe的版本日期,所以,在上述第3条的基础上,只需要判断update.txt的内容与项目进程映象名称的日期即可,以此决定是否需要大升级,根本不需要version.txt,以节约时间。

 回到顶部
帅哥哟,离线,有人找我吗?
shenyl0211
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2016/11/18 9:24:00 [显示全部帖子]

谢谢7楼的代码(实质和我的代码一样),原来高手也是这么认为的。

你的质疑说明你没有认真看我的全套代码及解释。
[此贴子已经被作者于2016/11/18 9:24:48编辑过]

 回到顶部