新手求助:编写可运行的TCL异步HTTP网页下载程序(附代码)
修复后的异步网页获取TCL程序
你的代码核心逻辑没问题,但缺少对vwait触发条件的处理——程序定义了等待::done变量,却从未在所有请求完成时设置它,导致程序会一直挂起。以下是修复后的完整可运行代码:
package require http # 初始化未完成请求计数器 set ::pending_requests 3 proc cb {token} { puts "网页内容长度:[string length [http::data $token]]" http::cleanup $token # 每完成一个请求就递减计数器 incr ::pending_requests -1 # 所有请求完成时触发vwait结束程序 if {$::pending_requests == 0} { set ::done 1 } } http::geturl "http://www.google.com" -command cb http::geturl "http://www.wikipedia.org" -command cb http::geturl "http://www.facebook.com" -command cb vwait ::done puts "所有网页请求已完成"
关键修改说明:
- 添加
::pending_requests全局变量跟踪未完成请求数量,初始值设为你发起的请求总数(此处为3) - 在回调函数
cb中,每处理完一个请求就将计数器减1 - 当计数器归0时,设置
::done变量,终止vwait的等待状态 - 优化了输出信息,让结果更易读
内容的提问来源于stack exchange,提问作者buchi
相关产品推荐
相关产品推荐

