[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[技术讨论] vbs 多线程问题

最近好奇 写了个多线程下载的vbs程序

发现 很奇怪的是 一开始很正常...但是过了一段时间之后 线程就自动关闭了...

估计是共同访问一个设置文件有关.... 有高手知道同时访问一个文件 进行读写 可行么?

这是开了10个线程的情况....

高手教教我vbs怎么多线程吧。

TOP

本帖最后由 caspar 于 2012-11-24 06:10 编辑
高手教教我vbs怎么多线程吧。
Demon 发表于 2012-11-23 23:43


主要是生成临时vbs 然后在父程序里头用
  1. Set objWShell = WScript.CreateObject ("WScript.Shell")
  2. objWShell.Run "Cscript " & command,0,False
复制代码
来调用 然后检测运行

TOP

这只是多进程,以前见过次碳酸钴写的多线程下载,那个可能才是真正的多线程,用 excuteglobal 异步下载 随机数字后缀函数名 实现同时下载多个文件

TOP

本帖最后由 caspar 于 2012-11-24 10:27 编辑
这只是多进程,以前见过次碳酸钴写的多线程下载,那个可能才是真正的多线程,用 excuteglobal 异步下载 随机 ...
CrLf 发表于 2012-11-24 07:52



    en ...也可以考虑一下 现在我这个用FSO的GetTempName生成随机文件的程序程序片段 在父程序ExcuteGlobal进来一样的 毕竟生成随机文件的时候 修改变量和函数名是很简单的....
   多文件下载只要在公共设置文件里头设置下载地址就行了  设置文件有类似的选项 暂时在测试每个随机文件的程序下载情况 每个进程都是把文件分块下载 但是发现有些进程会自动关闭 找不到错误...

TOP

主要是生成临时vbs 然后在父程序里头用来调用 然后检测运行
caspar 发表于 2012-11-24 00:21


哦,原来这样就是多线程啊,学习了。

TOP

本帖最后由 caspar 于 2012-11-24 20:16 编辑
哦,原来这样就是多线程啊,学习了。
Demon 发表于 2012-11-24 19:39



    CrLF更正了我 这样应该是多进程 多线程应该是ExecuteGlobal 来实现

    现在困扰我的是会自动关闭 要改成ExecuteGlobal 今天试验了一下 动态生成随机变量和函数 用RegExp.Replace 就没问题了 还能多进程+多线程+分Block来下载多个文件....

TOP

本帖最后由 caspar 于 2012-11-24 20:25 编辑
哦,原来这样就是多线程啊,学习了。
Demon 发表于 2012-11-24 19:39



    昨晚看了你的Blog 很不错~ 学了好多东西!! ~ 怪不得我觉得你的名字很熟

TOP

CrLF更正了我 这样应该是多进程 多线程应该是ExecuteGlobal 来实现

    现在困扰我的是会自动 ...
caspar 发表于 2012-11-24 20:14


ExecuteGlobal也不能实现多线程。

TOP

回复 9# Demon


    其实也不是 关键是怎么理解多线程的概念 在CPU的同一个线程里头 代码运行总是异步的 多线程的的意义在于CPU等待代码相应的时间里头 插入别的代码运行
   在下载的问题上 关键耗时间的是服务器响应到数据传输完成这个时间 而且是不确定的
   那用GetRef一个本地响应函数的地址指针给XMLHttp的OnReadyStateChange 让事件激活时候插入另外一个函数调用 在CPU运行速度大于代码等待时间的情况下 还是能近似看成是"同步"的多线程的

TOP

回复 10# caspar


    即使没有线程,CPU的时间片轮转也不会一直在那里等待某个进程。

TOP

本帖最后由 caspar 于 2012-11-26 00:16 编辑

回复 11# BAT-VBS


    是的 但就一个代码片段来说 在XMLHTTP .send之后 直到ReadyState=4之前 vbs会在停在send那个语句上 除非之前针对onReadyStateChange时间发生时设置过有函数调用事件
  
   例如
  1. Set xmlHttp = Wscript.CreateObject("Msxml2.ServerXMLHTTP")
  2.         xmlHttp.OnReadyStateChange = GetRef ( "HTTPStateChange" )
  3.         xmlHttp.open "GET", URL, False
  4.         xmlHttp.setRequestHeader "Referer", "http://xxx.xxx.xxx.xxx"
  5.         xmlHttp.setRequestHeader "Accept", "*/*"
  6.         xmlHttp.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 2.0.50727)"
  7.         xmlHttp.setRequestHeader "Range", "bytes=" & 0 & "-" & xxxxx
  8.         xmlHttp.setRequestHeader "Content-Type", "application/octet-stream"
  9.         xmlHttp.setRequestHeader "Pragma", "no-cache"
  10.         xmlHttp.setRequestHeader "Cache-Control", "no-cache"
  11.         xmlHttp.send
  12.        WScript.Echo xmlHttp.ResponseBody
  13. SUB HTTPStateChange
  14.    SELECT CASE xmlHTTP.readystate
  15.        CASE 0
  16.          WScript.Echo "对象已经建立!"
  17.        CASE 1
  18.          WScript.Echo "准备send..."
  19.        CASE 2
  20.          WScript.Echo "数据发送中..."
  21.        CASE 3
  22.         WScript.Echo "数据传送中..."
  23.        CASE 4
  24.          WSCript.Echo "请求完毕!"
  25.     END SELECT
  26. END SUB
复制代码
那么 显示出来的 是
  1. 对象已经建立!
  2. 准备send...
  3. 数据发送中...
  4. 数据传送中...
  5. (这里就开始等待buf 然后才显示ResponseBody的内容)
复制代码
这时候 就可以针对xmlHTTP.ReadyState来调用不同的函数

TOP

返回列表