启动形式关闭导致的启动画面线程错误

时间:2015-11-06 20:44:29

标签: vb.net splash-screen

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

但是这样做会出现线程错误。我猜测它是因为在完全加载Main表单之前启动表单已关闭。

以下是错误消息:

  

跨线程操作无效:控制' 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

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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

在WinForms中,启动画面不负责创建主窗体,不应该这样做。如果您在创建主表单之前需要运行代码,则在启动屏幕可见时,将该代码放在应用程序的Startup事件中。这是如何做到的:

  1. 转到项目属性的应用程序选项卡(设置启动窗体和启动画面的位置相同)。
  2. 点击“查看应用程序事件”
  3. 在靠近窗口顶部的事件下拉列表中,选择“启动”。这应该为Startup事件创建一个事件处理程序方法,如果它尚不存在(Private Sub MyApplication_Startup(sender, e) Handles Me.Startup)。
  4. 将您的代码(示例代码中的If Dir(...) Then Createfile()内容)放入事件处理程序中。
  5. 在创建主窗体之前,将调用Startup事件处理程序中的代码。启动屏幕将自动在另一个线程中创建,显示和销毁。您无需担心创建或关闭启动屏幕,因为这是自动完成的。

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

答案 1 :(得分:0)

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

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

因此,问题实际上是事件冲突。