本文bilibili视频讲解链接:https://www.bilibili.com/video/BV1zv411r7HD/
1.为什么要使用多线程?
因为程序是线性执行的,所以单线程的程序执行判断过程就会有先后顺序,往往对实时性判断要求高的游戏,单线程的脚本就无法做到及时处理信息,会出现因为漏判而导致的BUG。所以当出现需要同时进行判断的情况时,就需要用到多线程。
2.使用多线程出现的问题?
多线程虽然可以做到同时判断,但是线程与线程之间,难免会产生干扰,经常会出现A线程中的程序还没执行完毕,因为B线程同时也在执行,而导致A线程中的程序没办法按照预设完成执行。所以多线程好用,但是想控制好对于新手来说,也不是一件容易的事
3.使用多线程的注意事项
线程启动之后,不要频繁的去启停线程,这样会因为内存溢出而导致脚本异常终止。另外多线程占用的硬件资源较多,通常要尽量减少多线程的使用,防止硬件性能不足,导致的游戏和脚本崩溃。
4.多线程使用的两个例子
用法一:goto循环启停线程,缺点是会出现内存溢出脚本异常终止的问题,适用于启停间隔大的程序
Thread.SetShareVar "流程控制", False
Thread.SetShareVar "定时重启", False
Thread.SetShareVar "定时清理", False
Rem 标记
Dim a=Thread.Start(线程一)
Dim b=Thread.Start(线程二)
Dim c=Thread.Start(线程三)
While true
If Thread.GetShareVar("流程控制") = true Then
If Thread.GetShareVar("定时重启") = true Then
TracePrint "定时重启操作"
Else Thread.GetShareVar("定时清理") = true then
Thread.Stop (线程一)
Thread.Stop (线程一)
Thread.Stop (线程一)
Call 定时清理()
Thread.SetShareVar "流程控制", False
Thread.SetShareVar "定时清理", False
End If
End If
Wend
Goto 标记
Sub 线程一()
While True
Call 重启检测()
Call 清理检测()
Wend
End Sub
Sub 重启检测()
//比如此刻判断游戏该重启时了,流程控制和定时重启置为true
End Sub
Sub 定时重启()
TracePrint "重启游戏"
End Sub
Sub 清理检测()
//比如此刻判断游戏该清理时了,流程控制和定时清理置为true
If 满足清理背包条件 Then
Thread.SetShareVar "流程控制", true
Thread.SetShareVar "定时清理", true
End If
End Sub
Sub 定时清理()
TracePrint "清理背包"
End Sub
用法二:共享变量控制法,缺点是在时间的把控上不精确
Thread.SetShareVar "流程控制", False
Thread.SetShareVar "定时重启", False
Thread.SetShareVar "定时清理", False
Dim a=Thread.Start(线程一)
Dim b=Thread.Start(线程二)
Dim c=Thread.Start(线程三)
While true
If Thread.GetShareVar("流程控制") = true Then
If Thread.GetShareVar("定时重启") = true Then
TracePrint "定时重启操作"
Else Thread.GetShareVar("定时清理") = true then
Call 定时清理()
Thread.SetShareVar "流程控制", False
Thread.SetShareVar "定时清理", False
End If
End If
Wend
Sub 线程一()
While True
Call 重启检测()
Call 清理检测()
Wend
End Sub
Sub 线程二或者线程三里面的程序()
//这些程序的执行前提是:当检测到流程控制是处于空闲状态下,才执行检测。
//实际效果是该线程在执行,但是线程内的子程序未执行,达到了不干扰当前运行的线程的目的
If Thread.GetShareVar("流程控制") = false Then
//重启检测的业务逻辑
End If
End Sub
Sub 重启检测()
//比如此刻判断游戏该重启时了,流程控制和定时重启置为true
End Sub
Sub 定时重启()
TracePrint "重启游戏"
End Sub
Sub 清理检测()
If Thread.GetShareVar("流程控制") = false Then
//比如此刻判断游戏该清理时了,流程控制和定时清理置为true
If 满足清理背包条件 Then
Thread.SetShareVar "流程控制", true
Thread.SetShareVar "定时清理", true
End If
End If
End Sub
Sub 定时清理()
TracePrint "清理背包"
End Sub