我正在开发一个应用程序,可以在3x3(即9个屏幕)视频墙上监控生产信息。我现在处理的其中一个屏幕集合会检索信息并格式化为屏幕显示。大约需要2秒钟才能检索和格式化这些数据(仅是估计,未实际测量)。因为涉及到9个屏幕,所以依次切换到该屏幕集合时有很明显的时间延迟。驱动这个视频墙的PC具有8个处理器核心,因此在一个处理器忙于处理所有这些工作时,还有很多处理能力闲置。
我的第一个想法是使用多线程。不幸的是,我对这个概念很陌生。我只用过一次。我尝试创建BackgroundWorker,并让DoWork例程生成我的UI。不幸的是,在我尝试创建UI元素(Dim grLine as New Grid)时,它会崩溃。我设法通过创建虚拟DoWork例程,并在RunWorkerCompleted例程中生成所有UI来解决这个问题。这确实使我的空白窗口立即显示出来,但在所有UI被渲染之前,我生成的任何UI都不会显示出来。
以下是我要做的事情的非常简洁版本:
我尽力在代码中留下足够的细节,希望我的目标是明显的,但同时保持足够小,不会让人感到压抑。
编辑后添加:
大部分工作都在
我的第一个想法是使用多线程。不幸的是,我对这个概念很陌生。我只用过一次。我尝试创建BackgroundWorker,并让DoWork例程生成我的UI。不幸的是,在我尝试创建UI元素(Dim grLine as New Grid)时,它会崩溃。我设法通过创建虚拟DoWork例程,并在RunWorkerCompleted例程中生成所有UI来解决这个问题。这确实使我的空白窗口立即显示出来,但在所有UI被渲染之前,我生成的任何UI都不会显示出来。
以下是我要做的事情的非常简洁版本:
For i As Integer = 1 to 9
Dim win As New MyCustomWindow
win.DisplayScreen = i ' This function in MyCustomWindow sets the Bounds
win.MyShow({1, 2}) ' Sample args
Globals.VideoWall.Windows(i) = win
Next
MyCustomWindow类:
Class MyCustomWindow
Public Sub MyShow(a() as Integer)
Me.Show() ' Has a "Loading..." TextBlock
Dim bw as New ComponentModel.BackgroundWorker
AddHandler bw.DoWork, AddressOf Generate_UI_DoWork
AddHandler bw.RunWorkerCompleted, AddressOf Generate_UI_Complete
bw.RunWorkerAsync(a)
End Sub
Private Sub Generate_UI_DoWork((sender As Object, e As ComponentModel.DoWorkEventArgs)
' Pass our arguments to the Complete routine.
e.Result = e.Argument
End Sub
Private Sub Generate_OpsMarket_Complete(sender As Object, e As ComponentModel.RunWorkerCompletedEventArgs)
Dim IDs() as Integer
IDs = e.Result
Dim grLine As New Grid ' We crash here if this code is in DoWork instead of RunWorkerCompleted
For Each id As Integer In IDs
grLine.RowDefinitions.Add(New RowDefinition)
Dim txt as New TextBlock ' For a header
grLine.Children.Add(txt)
grLine.RowDefinitions.Add(New RowDefinition)
Dim MyCtrl as New MyCustomControl()
MyCustomControl.GetData(id)
grLine.Children.Add(MyCtrl.MyGrid)
txt.Text = MyCtrl.Header
Next
txLoading.Visibility = Visibility.Hidden
grRoot.Children.Add(grLine)
End Sub
End Class
我尽力在代码中留下足够的细节,希望我的目标是明显的,但同时保持足够小,不会让人感到压抑。
编辑后添加:
大部分工作都在
MyCustomControl.GetData(id)
中完成...该子程序从Web服务器下载数据(以JSON格式),解析JSON,然后为Grid生成行(3)和列(30或31,具体取决于月份),并填充它从Web服务器接收到的数据。
Generate_OpsMarket_Complete
内的所有内容都在MyShow
中...通过将大部分代码移动到BackgroundWorker中,希望所有9个屏幕的UI可以并行生成,而不是顺序生成。 - StarDestroyerGenerate_UI_Complete
,以便用于生成 UI。 - djv