我的“form1”只是一个简单的页面,其中的按钮可以启动不同的表单来完成所有工作,前四个按钮的“form1”代码如下所示。
我想要的是每个表单在一个单独的线程中运行。
Public Class Main
Private Sub btnDownLoadStockPrices_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDownLoadStockPrices.Click
LoadStocksFromDownloadSite.Visible = True
End Sub
Private Sub btnLoadOptionsIntoDatabase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadOptionsIntoDatabase.Click
LoadOptionsIntoDatabase.Visible = True
End Sub
Private Sub btnVerifyDatabases_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVerifyDatabases.Click
VerifyDatabase.Visible = True
End Sub
Private Sub btnAnalyzeStock_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnalyzeStock.Click
AnalyzeSingleStock.visible = True
End Sub
End Class
我发现大量代码示例在单个表单上运行子程序时在单个表单中运行不同的按钮,但由于某种原因,我似乎无法将其应用于整个表单。
我认为这很简单,就像我需要将每个新线程作为每个表单“加载”例程的句柄绑定,但我无法让它工作。我根本不关心“同步”线程,因为每个表单实际上是一个完全不同的功能程序。
任何帮助都会非常受欢迎!
答案 0 :(得分:3)
这不常见;通常,最好将所有UI内容限制为单个线程。但是,如果您确信需要在单独的线程上运行每个表单,则必须考虑Windows API事件处理模型。 [over] -simplified version是每个表单必须有自己的message loop来从队列中删除事件消息并处理它们,因此如果要在新线程上打开表单,则需要创建该消息泵。
最简单的方法是使用Application.Run
method,让.NET Framework处理为您创建消息泵。例如:
Dim frm As Form1 = New Form1()
Application.Run(frm)
通过查看问题中显示的代码,我无法分辨任何可能的原因,为什么这些表单需要在不同的线程上运行。您可以调用多个表单的Show
method,以便它们同时显示在屏幕上。只要您不使用ShowDialog
method,它们就不会相互阻挡,BackgroundWorker
class将每个显示为模态对话框。这是许多应用程序同时在屏幕上显示多个工具箱窗口和其他类型窗体的方式。
如果您需要进行某种类型的处理器密集型计算,您仍然不需要在单独的线程上运行每个计算。启动后台线程(Invoke
method使这非常简单)并使用{{3}}更新相应表单的UI。
答案 1 :(得分:1)
你当然可以在Win32上执行此操作,但我不知道这是如何映射到.net。
基本问题是窗口句柄具有线程关联性。因此,您确实需要与它们进行所有交互才能在该线程中发生。实质上,这意味着您在其线程中创建与该表单关联的所有窗口句柄。您还需要在线程中运行消息循环。
人们通常从主线程中运行所有UI并在单独的线程中处理长时间运行的操作的原因是它更容易。你应该再问自己为什么要以非标准的方式做这件事。
我怀疑你看不到全貌。当您有长时间运行的操作时,主要需要桌面应用程序中的线程。通常,您希望保持UI响应并为长时间运行的操作提供反馈。这样做会导致线程。
但是,在您提出的解决方案中,您现在拥有大量额外的线程和复杂性,并且您仍然面临着原始问题!除非您在单独的线程中执行该操作,否则对其中一个表单执行长时间操作将挂起它,并且我们再次达到问题的标准解决方案。