2017-05-15 13 views
-1

私は「FitnessFunction」関数を呼び出すたびに、バックグラウンドワーカーを使用してトポロジ上のオブジェクトを移動する、10回ループする遺伝的アルゴリズムを実行しました私が試してみました何同じバックグラウンドワーカーを実行してCのループ内で停止する方法

Cross-thread operation not valid: Control 'topology' accessed from a thread other than the thread it was created on... 

:それは、特定のポイントに達すると、私は残念ながら戻って「Genetic_Algorithm」機能に、バックグラウンドワーカーと...

をキャンセルし、私は次のエラーを得た

特定の条件の下でそれを停止させる "FitnessFunction"関数を呼び出すたびに、バックグラウンドワーカーを実行します。

+0

コントロールを更新できるUIスレッドでイベントを発生させる 'ReportProgress()'関数を使用する必要があります。それ以外の場合は、UIコントロールへの呼び出しを、作成されたUIスレッドにマーシャリングする必要があります。 https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.reportprogress(v=vs.110).aspx – xxbbcc

+0

@xxbbcc:答えを出すことはできますか? – Rose

答えて

0

WinFormsは、メインUI以外のスレッドからコントロールにアクセスすることを禁止しています。

Invoke(..)フォームの方法を使用するか、SynchronizationContextクラスを使用してください。

private SynchronizationContext context; 

MyForm() 
{ 
    InitializeComponents(); 
    context = SynchronizationContext.Current; 
} 

///// somewhere in another thread 
context.Post(myCallbackInUIThread, null) // you can use Send for synchronous call 
+0

while(真)の修正方法、そこでの呼び出し方法?あなたはあなたの答えを完了できますか? – Rose

+0

非UIスレッド(ワーカー)からコントロールを描画しようとしているときに例外がスローされます。描画操作を別の方法でラップし、[呼び出し/ポスト]を使用して呼び出します。 – rattler

関連する問題