Vb.net 调用委托后无法使用图形
我正在一个大型程序上开发一个功能。该功能需要调用一些计算密集型的东西,并且可能需要很长时间。从菜单项触发的计算结果将向当前图形中添加某些内容 还有许多其他选项可以更改当前图形。我不是在这里讨论这些问题。可以说,我希望我创建的“处理”是异步的,这样用户就不必盯着一个没有响应的屏幕看5分钟,以为程序坏了,但可以单击其他地方 因此:处理将是异步的,但在最后,我必须绘制结果 问题是:我不会画画 如果我运行我的代码,而不进行异步调用,那么当然,一切都可以完美地工作。但如果我在BeginInvoke上调用处理,则会出现一些问题: 1) 我调用的方法立即返回,因此在主线程中,如果我调用“draw”,结果还没有生成 2) 如果我试图将绘图放在EndInvoke之后,它位于错误的线程上,因此myGraphics中的每一项都会显示“参数无效” 3) 即使我在开始调用后立即保持调用(并以某种方式重新调用),我的图形仍然似乎转到了另一个线程,我似乎有错误的信息 为了获得最佳结果,我应该能够从线程返回,在EndInvoke之后以某种方式关闭它们。。。我只是不知道怎么做 下面的代码是一个片段,旨在显示对“processing”的调用,然后是“draw”。(编辑:我已经从代码中删除了更多内容,这样人们就不会试图键入代码,并认为我的问题是基本的编译错误,比如打字错误或其他错误) 当我说我的图形被修改。。。我真的看不出什么能改变它Vb.net 调用委托后无法使用图形,vb.net,multithreading,graphics,delegates,callback,Vb.net,Multithreading,Graphics,Delegates,Callback,我正在一个大型程序上开发一个功能。该功能需要调用一些计算密集型的东西,并且可能需要很长时间。从菜单项触发的计算结果将向当前图形中添加某些内容 还有许多其他选项可以更改当前图形。我不是在这里讨论这些问题。可以说,我希望我创建的“处理”是异步的,这样用户就不必盯着一个没有响应的屏幕看5分钟,以为程序坏了,但可以单击其他地方 因此:处理将是异步的,但在最后,我必须绘制结果 问题是:我不会画画 如果我运行我的代码,而不进行异步调用,那么当然,一切都可以完美地工作。但如果我在BeginInvoke上调用处
我一直在努力理解线程,代表们。。。非常感谢您的帮助。我发现System.Drawing.Graphics不能被任何函数“拥有”,因此像球一样被传递是没有意义的 由于它属于一个UI类,并且是通过绘制事件正确创建的,所以我的解决方案是将绘图过程与计算过程断开连接
在绘制之前,我没有等待计算完成,而是在有新信息绘制时单独绘制(由绘制事件触发),并异步计算,完全不考虑UI中发生的任何事情。我可以看到有人否决了我的问题,并投票关闭了它,没有评论——不管是否有用。我已经为这个问题争论了两天,所以如果你认为我没有付出足够的努力,或者有类似的问题,请给我一个提示——让我来处理类似的问题。非常感谢您提供的任何建设性帮助。您使用的编译选项是什么?选项显式打开?如果必须在绘图之前完成
Y()
所做的处理,那么异步调用它有什么好处?
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