1

私のアルゴリズムが2つの別々のスレッドで実行されるペトレルでマルチスレッドプラグインを開発しようとしています。プログレスバーを更新する方法が見つからないことを除いて、プラグインは正常に機能しているようです。

Invokeを使用してもプログレスバー(c#プログレスバー)は更新されず、実行中にUIが完全にフリーズします。

アルゴが実行されているときに別のスレッドからプログレスバー(ペトレルプログレスバーまたは標準プログレスバーのいずれか)を更新する方法はありますか?

ありがとう

4

2 に答える 2

4

Slb.Ocean.Petrel.PetrelLogger.NewAsyncProgress(String, ProgressType)またはを使用NewAsyncProgress(String, ProgressType, AsyncProgressCanceledCallback, Object)して、バックグラウンド スレッドから進行状況バーを更新します。

于 2011-10-06T12:51:18.557 に答える
2

Control.Invoke は、UI スレッドのメッセージ処理がブロックされていない場合にのみ機能します。メイン スレッドが結果を待っている場合は、定期的に Application.DoEvents を呼び出す必要があります。

Petrel プログレス バーについて: 通常、ユーザー インタラクションが許可されていない場合は単純なプログレス バーが使用されます。Petrel は操作が完了するまでブロックされますが、エンド ユーザーが何らかの操作を開始したものの、エンド ユーザーが操作を開始している間は作業できる場合は、1 つ以上の非同期プログレス バーが使用されます。操作はバックグラウンドで実行されています。

最初のアプローチを選択した場合、たとえば、各スレッドに表示される変数に進行状況を格納し (変数が適切にロックされていることを確認してください)、メイン スレッドはループ内でその変数を定期的に読み取り、それに応じて進行状況を更新できます。

于 2011-10-12T13:50:33.423 に答える