多线程是用于处理复杂项目的
创新互联是一家专注于网站设计制作、成都做网站与策划设计,宾阳网站建设哪家好?创新互联做网站,专注于网站建设10年,网设计领域的专业建站公司;建站业务涵盖:宾阳等地区。宾阳做网站价格咨询:18980820575
打个比方
你的主程序线程A中有个循环,由于代码是一行行走的,所以循环结束前下面的代码无法运行,而此时主界面的反应就类似卡死的样子,你点击按钮也没有反应,因为主线程在忙着循环呢,所以对按钮的事件代码要等待了,如果要避免这种情况,就要用到多线程,另开一个新线程专门用来执行循环代码,主界面就不会卡死了,只要在循环结束后将结果传回主线程调用就可以了,再复杂点要涉及到委托,控制了
按你的要求其实你的代码用不到多线程,只要把sleep放到两段代码中间就可以了。
新线程结束用thread.abort()
如果需要等待T2线程结束,那又何必开启这个线程!!
直接:
Label1.Visible = True
setB()
MsgBox("d")
这不就是执行完setB(),再执行MsgBox("d"),多线程是多余的。
多线程的作用大多数也就用来同时执行多任务而不用等待的。
用time控件啊,获取threadstate后,按指定时间间隔规定向界面刷新,线程必须是全局变量
用一个有退出条件的无限循环的sub也行。
线程开始就触发该过程,用无限循环来刷新状态,线程完成即退出无限循环。局部变量的线程也可以用这种方式。
不过用法要正确,否则会出问题。
你可以在timer前用if判断网络状态,
如断开,可用
threading.Thread.Sleep(10000) ‘当前线程挂起10秒
’可以开一个新线程去读取脱机数据。
如连接,则继续执行。
补充:
dim i as integer
'超过100次退出,避免死循环
for i=0 to 100
try
'ping你的端口
if ‘ok
exit for
else
threading.Thread.Sleep(10000) ‘当前线程挂起10秒
end
Catch ex As Exception
End Try
next
使用api
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
我告诉你思路,你自己去实现。
建议你用“守护线程”的方式去做,这样做对于你一个小任务来说更合适。首先,你要建立一个队列,将所有下载任务放入队列。注意,这个队列必须是“线程安全”的,即两个线程不会抢到同一个任务。然后只开10个线程。这些线程会从队列中读取任务。当一个线程不能再从队列中读取任务时,也就是队列为空时,退出。等所有线程都退出后,你的程序就结束了。
还有一种方法,叫“线程池”,也就是你说的方法,稍微复杂一点:
指定一个变量,用来表示线程的数量。刚开始为0,每开一个线程+1。当一个线程完成任务退出后,这个变量-1。直到所有任务都完成后,不再产生新线程。