私は自分のスレッドを実行しているオブジェクトを持っており、ウェブカメラからの入力を処理し、ウィンドウコントロールを更新しています。操作中、ユーザーは、現在のスレッドのサスペンド、独自のスレッドでの新しいフォームのオープン、ユーザーにinutの実行を依頼してOKをクリックするようにアプリケーションを調整したいと指示することがあります。元の履歴書。私のキャリブレーションフォームは、元のオブジェクトで別のスレッドで新しいフォームダイアログを開きます。
//Constructor() {}
public void StartCalibration() {
Debug.WriteLine("StartCalibration CALLED!");
var thread = new Thread(Run);
thread.Start();
}
private void Run() {
while (!finished) {
//process user input
this.Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
Graphics g = e.Graphics;
if (image != null)
g.DrawImage(image, new Point(15, 15));
}
が、私は
public void Run() {
if (calibrate == true) {
CalibrationForm calibrationForm = new CalibrationForm(source);
if (calibrationForm.InvokeRequired)
calibrationForm.Invoke(new MethodInvoker(calibrationForm.StartCalibration));
else
calibrationForm.StartCalibration();
if (calibrationForm.ShowDialog() == DialogResult.OK)
//get data from calibrationForm
calibrationForm.Dispose();
}
//continue with this threads operation
それはShowDialogの(への呼び出しのように見えますが)しかし、まだ例外をスローして、以下の持っているスレッドのように見えます
クロススレッド操作が有効でない:コントロール 'CalibrationForm'が、作成されたスレッド以外のスレッドから にアクセスしました
私は現在、自分の現在のスレッドを一時停止して、キャリブレーションフォームが完了するまで待つか、自分の目標を達成するためのより良い方法があるかどうかを知りたいのですか?
ああ、答えのための喝采。私はそれが自分のスレッドでフォームをsublcassingのアイデアを放棄する必要があると推測しています... – hspim
これはいくつかの詳細を見て、これは実際に致命的な終わりかどうかを確認してください?私はそれ自身のスレッドで作成している新しいフォームは、プライマリUIとのやりとり(または、とにかく必要)はありません。単一のローカライズされたタスクを実行し、結果を最初のスレッドに返すことだけが存在します.... – hspim
メインスレッドですべてのUIを実行する必要があります。それらはゲームのルールです。 –