【问题标题】:Splash-screen threading error due to startup form closing由于启动表单关闭导致的闪屏线程错误
【发布时间】:2015-11-06 20:44:28
【问题描述】:

我有一个正在制作的桌面应用程序的启动画面。启动的工作方式是检查某些文件,如果找到它们会立即关闭并加载主窗体。

但是这样做我得到一个线程错误。我猜是因为启动表单在完全加载主表单之前关闭。

这是错误信息:

跨线程操作无效:控件“frm_SplashScreen”从创建它的线程以外的线程访问。

我尝试过让线程进入睡眠状态,甚至使用计时器来让表单有时间加载。但到目前为止没有成功。

Private Sub frm_Load_Load(sender As Object, e As EventArgs) Handles MyBase.Load
If Dir("System.dll") = "" then
 Createfile()
 Frm_Main.show()
 Me.close()
Else  
 Frm_Main.show()
 Me.close()
End IF

关于启动画面的所有其他内容都在应用程序下的项目属性中完成。否则它只是一个空表单。

我该如何解决这个问题?

【问题讨论】:

  • 您是自己创建了启动画面还是使用了 Visual Studio 提供的内置模板?
  • 这是 WinForms 吗?你是在项目属性中设置了项目的启动表单和启动画面,还是有其他方式?
  • 我创建了它,所以我添加了一个新的窗口窗体并将其设计为看起来像一个飞溅。然后在项目属性中,我将启动画面设置为该表单。但是我已经尝试过模板,它仍然会产生同样的错误。

标签: vb.net splash-screen


【解决方案1】:

在 WinForms 中,启动屏幕不负责创建主窗体,也不应该这样做。如果您有代码需要在创建主窗体之前运行,而初始屏幕可见,则将该代码放在应用程序的Startup 事件中。操作方法如下:

  1. 转到项目属性的应用程序选项卡(与设置启动表单和启动屏幕相同的位置)。
  2. 点击“查看应用程序事件”
  3. 在窗口顶部附近的事件下拉列表中,选择“启动”。这应该为 Startup 事件创建一个事件处理程序方法,如果它尚不存在 (Private Sub MyApplication_Startup(sender, e) Handles Me.Startup)。
  4. 将您的代码(示例代码中的 If Dir(...) Then Createfile() 内容)放入事件处理程序中。

在创建主窗体之前将调用 Startup 事件处理程序中的代码。启动画面将在另一个线程中自动创建、显示和销毁。您无需担心创建或关闭启动画面,因为这是自动完成的。

如果您的启动代码确定您根本不想显示主窗体,请在启动事件处理程序方法中设置e.Cancel = true,应用程序将退出而不是调出主窗体。

【讨论】:

    【解决方案2】:

    嗯,根据我之前的经验,这是 Visual Studio 中的一个错误,它是由于将您的启动表单设置为 window state.maximized 覆盖了默认启动事件。因此,为了解决这个问题,您需要启动以嘲笑启动然后在启动屏幕的表单关闭事件上设置事件,而不是直接在启动 form.worked 上运行超过 5 个项目。在我将最大化状态移动到启动关闭事件之前,他们都有相同的问题,例如

    Private sub splash_closed(....)
    Startup form.window state.maximized...
    End sub
    

    所以,问题实际上是事件冲突。

    【讨论】:

      猜你喜欢
      • 2011-09-10
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2020-12-01
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多