我正在创建一个视频游戏,我需要一次显示一个字符,而互联网的其他部分对我们一无所知的旧版Visual Basic基本没什么帮助。< / p>
这是我错误的代码:
Dim outfile As IO.StreamWriter
Dim infile As IO.StreamReader
Private Sub StartScreen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim strTitle As String = " "
Dim strText() As String = {}
Dim intLoop As Integer = 0
If IO.File.Exists("save.txt") = False Then
outfile = IO.File.CreateText("save.txt")
End If
infile = IO.File.OpenText("save.txt")
Do Until infile.Peek = -1
strText(intLoop) = infile.Read
System.Threading.Thread.Sleep(1000)
intLoop += 1
Loop
intLoop = 0
Do While strText.Length <> intLoop
strTitle = strText(intLoop)
lblTitle.Text = lblTitle.Text & strTitle
intLoop += 1
Loop
infile.Close()
outfile.Close()
End Sub
答案 0 :(得分:0)
首先 - 除了您的主要问题之外 - 您的Thread.Sleep
似乎位于错误的位置。当你将文件读入内存时,你正在睡觉,但是当你将文本复制到你的'lblTitle'时却没有 - 所以你花了很长时间阅读文件,然后立即将整个文件复制到UI中。这不是你想要的效果:读取整个文件,并将延迟放在第二个循环中。
您的表单未显示的原因是您的所有代码都在表单的_Load
方法中 - 并且表单在完成之前不会显示。因此,相反,您的表单会在文本中保持隐藏的秒数。它应该最终出现,但这不是你所追求的效果,我敢肯定!
处理此问题的最直接方法是将所有代码推送到单独的方法中,并在后台线程上调用该方法。这将允许您的表单加载和显示,后台线程将继续处理您的文本。但是,您需要稍微修改代码,因为您无法从后台线程修改UI。查看Invoke
和/或BeginInvoke
方法,了解如何解决此问题。
另一个解决方案是取出Thread.Sleep(1000)
,将代码移到单独的方法,然后在Timer
上调用该方法。计时器可以每秒触发一次并每次添加文本的下一个字符。这可能会产生更清晰的代码,但您可能希望确保直接读取和关闭文件,而不是(正如您现在所做的那样)保持文件锁定,直到整个过程完成。