由于启动窗体关闭导致的闪屏线程错误
Splash-screen threading error due to startup form closing
我正在制作的桌面应用程序有启动画面。启动的工作方式是检查某些文件,如果找到它们,它会立即关闭并加载主窗体。
但是这样做我得到了一个线程错误。我猜是因为启动窗体在完全加载主窗体之前就关闭了。
错误信息如下:
Cross-thread operation not valid: Control 'frm_SplashScreen' accessed from a thread other than the thread it was created on.
我试过让线程进入休眠状态,甚至使用计时器让表单有时间加载。但至今未成功。
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
关于启动画面的所有其他内容都在应用程序下的项目属性中完成。否则它只是一个空表格。
我该如何解决这个问题?
在 WinForms 中,启动画面不负责创建主窗体,也不应该这样做。如果您有代码需要在创建主窗体之前 运行,当初始屏幕可见时,将该代码放在应用程序的 Startup
事件中。方法如下:
- 转到项目属性的应用程序选项卡(设置启动窗体和初始屏幕的相同位置)。
- 点击"View Application Events"
- 在 window、select "Startup" 顶部附近的事件下拉列表中。这应该为 Startup 事件创建一个事件处理程序方法,如果它尚不存在 (
Private Sub MyApplication_Startup(sender, e) Handles Me.Startup
)。
- 将您的代码(示例代码中的
If Dir(...) Then Createfile()
内容)放入事件处理程序中。
启动事件处理程序中的代码将在创建主窗体之前被调用。启动画面将在另一个线程中自动创建、显示和销毁。您无需担心创建或关闭初始屏幕,因为这是自动完成的。
如果您的启动代码确定您根本不想显示主窗体,请在启动事件处理程序方法中设置 e.Cancel = true
,应用程序将退出而不是调出主窗体。
好吧,根据我以前的经验,这是 visual studio 中的一个错误,它是由于将您的启动表单设置为 window state.maximized
覆盖默认启动事件的结果。所以为了解决这个问题,你需要在开机启动时笑一下,然后在启动画面的表单关闭事件上设置事件,而不是直接在开机启动 form.worked
上设置事件 运行 超过 5项目。他们都有同样的问题,直到我将最大化状态移动到飞溅关闭事件,例如
Private sub splash_closed(....)
Startup form.window state.maximized...
End sub
所以,问题实际上是事件冲突。
我正在制作的桌面应用程序有启动画面。启动的工作方式是检查某些文件,如果找到它们,它会立即关闭并加载主窗体。
但是这样做我得到了一个线程错误。我猜是因为启动窗体在完全加载主窗体之前就关闭了。
错误信息如下:
Cross-thread operation not valid: Control 'frm_SplashScreen' accessed from a thread other than the thread it was created on.
我试过让线程进入休眠状态,甚至使用计时器让表单有时间加载。但至今未成功。
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
关于启动画面的所有其他内容都在应用程序下的项目属性中完成。否则它只是一个空表格。
我该如何解决这个问题?
在 WinForms 中,启动画面不负责创建主窗体,也不应该这样做。如果您有代码需要在创建主窗体之前 运行,当初始屏幕可见时,将该代码放在应用程序的 Startup
事件中。方法如下:
- 转到项目属性的应用程序选项卡(设置启动窗体和初始屏幕的相同位置)。
- 点击"View Application Events"
- 在 window、select "Startup" 顶部附近的事件下拉列表中。这应该为 Startup 事件创建一个事件处理程序方法,如果它尚不存在 (
Private Sub MyApplication_Startup(sender, e) Handles Me.Startup
)。 - 将您的代码(示例代码中的
If Dir(...) Then Createfile()
内容)放入事件处理程序中。
启动事件处理程序中的代码将在创建主窗体之前被调用。启动画面将在另一个线程中自动创建、显示和销毁。您无需担心创建或关闭初始屏幕,因为这是自动完成的。
如果您的启动代码确定您根本不想显示主窗体,请在启动事件处理程序方法中设置 e.Cancel = true
,应用程序将退出而不是调出主窗体。
好吧,根据我以前的经验,这是 visual studio 中的一个错误,它是由于将您的启动表单设置为 window state.maximized
覆盖默认启动事件的结果。所以为了解决这个问题,你需要在开机启动时笑一下,然后在启动画面的表单关闭事件上设置事件,而不是直接在开机启动 form.worked
上设置事件 运行 超过 5项目。他们都有同样的问题,直到我将最大化状态移动到飞溅关闭事件,例如
Private sub splash_closed(....)
Startup form.window state.maximized...
End sub
所以,问题实际上是事件冲突。