我正在制作一个桌面应用程序的启动画面。启动工作的方式是它检查某些文件,如果它发现它立即关闭并加载主窗体。
但是这样做会出现线程错误。我猜测它是因为在完全加载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
关于启动画面的其他所有内容都在应用程序的项目属性中完成。否则它只是一个空的形式。
我该如何解决这个问题?
答案 0 :(得分:2)
在WinForms中,启动画面不负责创建主窗体,不应该这样做。如果您在创建主表单之前需要运行代码,则在启动屏幕可见时,将该代码放在应用程序的Startup
事件中。这是如何做到的:
Private Sub MyApplication_Startup(sender, e) Handles Me.Startup
)。If Dir(...) Then Createfile()
内容)放入事件处理程序中。在创建主窗体之前,将调用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
因此,问题实际上是事件冲突。