0

我正在创建一个视频游戏,我需要一次显示一个字符,而互联网的其余部分几乎没有帮助,因为它们适用于我一无所知的旧版本的 Visual Basic。

这是我的错误代码:

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
4

1 回答 1

0

首先 - 除了你的主要问题 - 看来你Thread.Sleep是在错误的地方。当您将文件读入内存时,您正在睡觉,而不是在将文本复制到“lblTitle”时 - 因此您需要很长时间才能读取文件,然后立即将整个内容复制到 UI 中。这不是您要寻找的效果:读取整个文件,并将延迟放在第二个循环中。

您的表单未显示的原因是您的所有代码都在_Load表单的方法中 - 并且在完成之前不会显示表单。因此,相反,您的表单隐藏的秒数与您在文本中的秒数相同。它最终应该会出现,但这不是你想要的效果,我敢肯定!

处理此问题的最直接方法是将所有代码推送到一个单独的方法中,并在后台线程上调用该方法。这将允许您的表单加载和显示,并且后台线程将继续处理您的文本。但是,您需要稍微修改您的代码,因为您无法从后台线程修改您的 UI。查找Invoke和/或BeginInvoke方法以了解如何解决此问题。

另一种解决方案是取出你的Thread.Sleep(1000),将你的代码移动到一个单独的方法,然后在Timer. 计时器可以每秒触发一次并每次添加文本的下一个字符。这可能会产生更清晰的代码,但您可能希望确保立即读取和关闭文件,而不是(就像您现在所做的那样)保持文件锁定直到整个过程完成。

于 2012-05-18T06:59:57.933 回答