-1

我正在开发一个大型程序的功能。该功能需要调用一些计算密集型的东西,并且可能需要很长时间。从菜单项触发的计算结果将向当前图形添加一些内容。

还有许多其他选项可以更改当前图形。我不是在这里讨论它们。可以这么说,我希望我创建的“处理”是异步的,这样用户就不必盯着一个无响应的屏幕 5 分钟以为程序坏了,但能够点击其他地方...

所以:处理将是异步的,但最后,我将不得不绘制结果。

问题:我不会画画。

如果我在没有异步调用的情况下运行我的代码,当然一切都会完美运行。但是如果我在 BeginInvoke 上调用处理,就会出现一些问题:

1)我调用的方法立即返回,所以在主线程中,如果我调用“draw”,结果还没有生成

2) 如果我尝试在 EndInvoke 之后进行绘图,则它位于错误的线程上,因此 myGraphics 中的每个项目都显示“参数无效”。

3)即使我在 BeginInvoke 之后保持通话(并以某种方式重新调用它),myGraphics 似乎仍然转到了另一个线程,我似乎有错误的信息。

为了获得最佳结果,我应该能够在 EndInvoke 之后从线程返回,以某种方式关闭它们......我只是不知道如何。

以下代码是一个片段,旨在显示对“处理”的调用,然后是“绘制”。(编辑:我已经从代码中删除了更多内容,因此人们不会尝试输入它并认为我的问题是基本的编译错误,例如拼写错误或其他东西)

Public Sub mine(ByVal myGraphics As System.Drawing.Graphics)
  a_call()
 ' use results from the finished call to process graphics
  my_draw(myGraphics)
 ' if I add my_draw here, previous call only had BeginInvoke... more complicated to prevent my_draw... 
 ' but it is not horrible to have first draw empty, and later draw correctly (if there is a way to trigger it - which I don't really have)
 ' The bigger problem is, myGraphics becomes defective (its VisibleClipbounds change, most points are not drawn anymore - or it becomes undefined)
 ' I don't understand why myGraphics changes or how to fix it
end sub

Public Sub a_call()      
  Dim c As New ADelegate(AddressOf A)    ' which is the processing call
  c.BeginInvoke(cb, Nothing)
End Sub

Private Sub A_Callback(ByVal ia As IAsyncResult)      
  ...EndInvoke(ia)
  A_Finish()
End Sub
Private Sub A_Finish()
  If Me.InvokeRequired Then
     Invoke(New ADelegate(AddressOf A_Finish))
  Else
   ' call my_draw because I should be done with the Invoke ?
   ' If I add my_draw here, it is undefined
End Sub

当我说 myGraphics 被修改时......我真的看不出有什么可以改变它......

我一直在努力理解线程和委托......任何帮助表示赞赏。

4

1 回答 1

0

我发现 System.Drawing.Graphics 不能被任何函数“拥有”,因此像球一样传递是没有意义的。

由于它属于 UI 类 - 并且使用 Paint 事件正确创建 - 我的解决方案是将绘图过程与计算过程断开连接。

我没有在绘制之前等待计算完成,而是在我有新信息要绘制时单独绘制(由绘制事件触发),并且我异步计算 - 完全无视 UI 中发生的任何事情。

于 2013-03-28T16:11:26.900 回答