私は大規模なプログラムの機能に取り組んでいます。この機能には、計算量が多く、時間がかかる可能性があるものへの呼び出しが必要です。メニュー項目からトリガーされる計算の結果は、現在の図面に何かを追加します。
現在の図面を変更するオプションは他にもたくさんあります。ここではそれらについて議論していません。私が作成した「処理」を非同期にして、ユーザーがプログラムが壊れていると思って応答しない画面を 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 が変更されると言ったとき...何がそれを変更できるのか本当にわかりません...
私はスレッド化とデリゲートの理解と戦ってきました...どんな助けも大歓迎です。