标题: [技术讨论] vbs 多线程问题 [打印本页]
作者: caspar 时间: 2012-11-23 21:32 标题: vbs 多线程问题
最近好奇 写了个多线程下载的vbs程序
发现 很奇怪的是 一开始很正常...但是过了一段时间之后 线程就自动关闭了...
估计是共同访问一个设置文件有关.... 有高手知道同时访问一个文件 进行读写 可行么?
这是开了10个线程的情况....
作者: Demon 时间: 2012-11-23 23:43
高手教教我vbs怎么多线程吧。
作者: caspar 时间: 2012-11-24 00:21
本帖最后由 caspar 于 2012-11-24 06:10 编辑
高手教教我vbs怎么多线程吧。
Demon 发表于 2012-11-23 23:43
主要是生成临时vbs 然后在父程序里头用- Set objWShell = WScript.CreateObject ("WScript.Shell")
- objWShell.Run "Cscript " & command,0,False
复制代码
来调用 然后检测运行
作者: CrLf 时间: 2012-11-24 07:52
这只是多进程,以前见过次碳酸钴写的多线程下载,那个可能才是真正的多线程,用 excuteglobal 异步下载 随机数字后缀函数名 实现同时下载多个文件
作者: caspar 时间: 2012-11-24 09:52
本帖最后由 caspar 于 2012-11-24 10:27 编辑
这只是多进程,以前见过次碳酸钴写的多线程下载,那个可能才是真正的多线程,用 excuteglobal 异步下载 随机 ...
CrLf 发表于 2012-11-24 07:52
en ...也可以考虑一下 现在我这个用FSO的GetTempName生成随机文件的程序程序片段 在父程序ExcuteGlobal进来一样的 毕竟生成随机文件的时候 修改变量和函数名是很简单的....
多文件下载只要在公共设置文件里头设置下载地址就行了 设置文件有类似的选项 暂时在测试每个随机文件的程序下载情况 每个进程都是把文件分块下载 但是发现有些进程会自动关闭 找不到错误...
作者: Demon 时间: 2012-11-24 19:39
主要是生成临时vbs 然后在父程序里头用来调用 然后检测运行
caspar 发表于 2012-11-24 00:21
哦,原来这样就是多线程啊,学习了。
作者: caspar 时间: 2012-11-24 20:14
本帖最后由 caspar 于 2012-11-24 20:16 编辑
哦,原来这样就是多线程啊,学习了。
Demon 发表于 2012-11-24 19:39
CrLF更正了我 这样应该是多进程 多线程应该是ExecuteGlobal 来实现
现在困扰我的是会自动关闭 要改成ExecuteGlobal 今天试验了一下 动态生成随机变量和函数 用RegExp.Replace 就没问题了 还能多进程+多线程+分Block来下载多个文件....
作者: caspar 时间: 2012-11-24 20:24
本帖最后由 caspar 于 2012-11-24 20:25 编辑
哦,原来这样就是多线程啊,学习了。
Demon 发表于 2012-11-24 19:39
昨晚看了你的Blog 很不错~ 学了好多东西!! ~ 怪不得我觉得你的名字很熟
作者: Demon 时间: 2012-11-25 00:24
CrLF更正了我 这样应该是多进程 多线程应该是ExecuteGlobal 来实现
现在困扰我的是会自动 ...
caspar 发表于 2012-11-24 20:14
ExecuteGlobal也不能实现多线程。
作者: caspar 时间: 2012-11-25 20:38
回复 9# Demon
其实也不是 关键是怎么理解多线程的概念 在CPU的同一个线程里头 代码运行总是异步的 多线程的的意义在于CPU等待代码相应的时间里头 插入别的代码运行
在下载的问题上 关键耗时间的是服务器响应到数据传输完成这个时间 而且是不确定的
那用GetRef一个本地响应函数的地址指针给XMLHttp的OnReadyStateChange 让事件激活时候插入另外一个函数调用 在CPU运行速度大于代码等待时间的情况下 还是能近似看成是"同步"的多线程的
作者: BAT-VBS 时间: 2012-11-25 23:49
回复 10# caspar
即使没有线程,CPU的时间片轮转也不会一直在那里等待某个进程。
作者: caspar 时间: 2012-11-26 00:04
本帖最后由 caspar 于 2012-11-26 00:16 编辑
回复 11# BAT-VBS
是的 但就一个代码片段来说 在XMLHTTP .send之后 直到ReadyState=4之前 vbs会在停在send那个语句上 除非之前针对onReadyStateChange时间发生时设置过有函数调用事件
例如- Set xmlHttp = Wscript.CreateObject("Msxml2.ServerXMLHTTP")
- xmlHttp.OnReadyStateChange = GetRef ( "HTTPStateChange" )
- xmlHttp.open "GET", URL, False
- xmlHttp.setRequestHeader "Referer", "http://xxx.xxx.xxx.xxx"
- xmlHttp.setRequestHeader "Accept", "*/*"
- xmlHttp.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 2.0.50727)"
- xmlHttp.setRequestHeader "Range", "bytes=" & 0 & "-" & xxxxx
- xmlHttp.setRequestHeader "Content-Type", "application/octet-stream"
- xmlHttp.setRequestHeader "Pragma", "no-cache"
- xmlHttp.setRequestHeader "Cache-Control", "no-cache"
- xmlHttp.send
-
- WScript.Echo xmlHttp.ResponseBody
-
- SUB HTTPStateChange
-
- SELECT CASE xmlHTTP.readystate
- CASE 0
- WScript.Echo "对象已经建立!"
- CASE 1
- WScript.Echo "准备send..."
- CASE 2
- WScript.Echo "数据发送中..."
- CASE 3
- WScript.Echo "数据传送中..."
- CASE 4
- WSCript.Echo "请求完毕!"
- END SELECT
-
- END SUB
复制代码
那么 显示出来的 是- 对象已经建立!
- 准备send...
- 数据发送中...
- 数据传送中...
- (这里就开始等待buf 然后才显示ResponseBody的内容)
复制代码
这时候 就可以针对xmlHTTP.ReadyState来调用不同的函数
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |