【问题标题】:How can I get my VB GUI not to freeze while the program is running?如何让我的 VB GUI 在程序运行时不冻结?
【发布时间】:2014-09-25 01:09:23
【问题描述】:

我正在使用 VB 在 Visual Studio 2012 中编写一个程序,该程序可以打开和调整非常大的 Excel 文件,但从允许用户选择文件位置和数据来源文件的 GUI 开始。我还添加了一个进度条和一个文本框来显示进度,因为它有助于查看问题出现的位置并显示实际正在发生的事情。

不幸的是,尽管片段和代码都已准备就绪,但程序一旦开始运行,它就会冻结,既不显示也不键入任何内容。在程序结束时(一旦成功完成),您可以看到一切都按预期进行并已输入。这一切都在一个类中,因为它是一个相当简单的应用程序。

我已尝试添加 System.Threading.Thread.Sleep(1000),希望暂停将允许程序随时更新。不幸的是,这种情况并非如此。如何让程序减速足够长的时间以通过视觉更新?

【问题讨论】:

    标签: vb.net visual-studio-2012 user-interface vb6 refresh


    【解决方案1】:

    您要做的是为您的 excel 处理创建一个单独的线程。

    http://msdn.microsoft.com/en-us/library/btky721f.aspx

    编辑:

    VB6 中的线程文档(没有看到您的 VB6 标签,以防万一)

    http://msdn.microsoft.com/en-us/library/aa719109%28v=vs.71%29.aspx

    为什么?

    你的主窗口是一个独立的线程,所有的绘图和更新都在这个线程中完成。如果一段代码需要一段时间才能执行,整个线程将被阻塞等待这段代码完成执行,因此应用程序上不会刷新任何内容

    现在,Thread.Sleep(1000) 调用只是将您的主窗口冻结了一秒钟

    通过为您的 excel 处理创建一个单独的线程,您现在可以释放主窗口,以便用户可以在完成时继续输入内容。

    【讨论】:

    • 我认为会是这样。 excel 线程是否需要从 MainWindow 进入一个完全独立的类才能正确更新,或者我可以在该类中创建两个单独的线程,让一个更新窗口数据,另一个处理处理?
    • 我会像 ExcelProcess 一样为它创建一个单独的类,并在公共“运行”函数或任何你想在里面调用它的东西上创建一个线程。创建一个类还允许您将线程的参数作为类内的成员变量传递,可以在线程内的“运行”循环内访问。另外,您的代码将与一个大文件分开,以便以后阅读和编辑
    • 如果你只想调用一个单独的函数,你可能想看看这里,因为我还没有试验过它,我暂时无法访问 Visual Studio。希望这有助于stackoverflow.com/questions/13603606/…
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多