Передача переменных из потока в другую форму с использованием C # - PullRequest
2 голосов
/ 05 апреля 2010

Я пытаюсь передать 2 переменные из потока в MainForm в другую форму, но при этом возникает ошибка.

private void TrackingThread( )
    {
        float targetX = 0;
        float targetY = 0;

        while ( true )
        {
            camera1Acquired.WaitOne( );
            camera2Acquired.WaitOne( );

            lock ( this )
            {
                // stop the thread if it was signaled
                if ( ( x1 == -1 ) && ( y1 == -1 ) && ( x2 == -1 ) && ( y2 == -1 ) )
                {
                    break;
                }

                // get middle point
                targetX = ( x1 + x2 ) / 2;
                targetY = ( y1 + y2 ) / 2;
            }

            if (directionForm != null)
            {
                directionForm.RunMotors(targetX, targetY);
            }
        }
    }

В форме directionForm я просто отображаюпеременные targetX и targetY.Код для directionForm.RunMotors () выглядит следующим образом:

public void RunMotors(float x, float y)
    {
        label1.Text = "X-ordinate " + x.ToString();
        label2.Text = "Y-ordinate " + y.ToString();
    }

Ошибка возникает при попытке отобразить две переменные: «InvalidOperationException не обработано. Недопустимая операция многопоточности: элемент управления label1, доступный изнить, отличная от нити, в которой оно было создано "

Что мне делать ???

Заранее спасибо

Ответы [ 3 ]

5 голосов
/ 05 апреля 2010

Весь графический интерфейс пользователя не поточно-ориентированный, ошибка, которую вы видите, является преднамеренной проверкой. Вы должны передать метод в messagepump, чтобы он выполнялся в главном потоке. Используйте что-то вроде:

if (directionForm != null)            
{
   var a = new Action<float, float>(RunMotors);
   directionForm.Invoke(a, targetX, targetY);
}
0 голосов
/ 05 апреля 2010

Простое решение для незаконных вызовов между потоками

Также проверьте Control.CheckForIllegalCrossThreadCalls Property.

Когда поток, отличный от потока создания элемента управления, пытается получить доступ к одному из методов или свойств этого элемента управления, это часто приводит к непредсказуемым результатам. Обычная недопустимая активность потока - это вызов неправильного потока, который обращается к свойству Handle элемента управления. Установите для CheckForIllegalCrossThreadCalls значение true, чтобы легче находить и диагностировать эту активность потока во время отладки. Обратите внимание, что незаконные вызовы между потоками всегда вызывают исключение, когда приложение запускается вне отладчика.

0 голосов
/ 05 апреля 2010

Вы должны обновить свой интерфейс из потока пользовательского интерфейса. Вызвать метод в потоке пользовательского интерфейса. По сути, это то же самое, что написал Хенк Холтерман. UpdateUIDelegate должен иметь ту же подпись, что и ваш метод RunMotors.

void UpdateUI() {
    if (this.yourControl.InvokeRequired) {
        object[] ob = new object[] { targetX, targetY };
        UpdateUIDelegate updDel = new UpdateUIDelegate(RunMotors);
        this.yourControl.Invoke(updDel, ob);
    }
    else {
        this.RunMotors(targetX, targetY);
    }
}

void RunMotors(targetX, targetY)
{
    // action
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...