2013-11-10 2 views
0

В настоящее время у меня есть рабочая программа, которая отображает предварительный просмотр с моей веб-камеры и использует интерфейс ISampleGrabberCB.Обновление текстового поля от ISampleGrabberCB

С помощью SampleCB моя программа преобразует изображение в растровое изображение, а затем обрабатывает изображение для штрих-кода, который затем декодируется. Это отлично работает, когда я показываю результат, используя MessageBox, однако, когда я хочу редактировать текстовое поле в своей основной форме с этим результатом, я получаю несколько ошибок при запуске моей программы.

Я пытаюсь обновить текстовое поле, используя следующий код в интерфейсе ISampleGrabberCB:

public int SampleCB(double sampletime, IMediaSample sample) 
    { 
     if (sample == null) 
     { 
      return -1; 
     } 
     try 
     { 
      int length = sample.GetActualDataLength(); 
      IntPtr buffer; 
      BitmapData bitmapData = new BitmapData(); 

      Form1 f1 = new Form1("", "", ""); 


      if (sample.GetPointer(out buffer) == 0 && length > 0) 
      { 
       Bitmap bitmapOfFrame = new Bitmap(width, height, pitch, PixelFormat.Format24bppRgb, buffer); 


      } 

Метод changeTextBox1 в моей основной форме и выглядит следующим образом:

public void changeTextBox1(string text) 
    { 
     textBox1.Text = text; 
    } 

Ошибки Я получаю, во-первых, A device attached to the system in not functioning properly, а затем no such supported interface. Это происходит, только когда я использую линию Form1 f1 = new Form1("","","");.

Как я уже сказал, если я удалю линию Form1 f1 = new Form1("","",""); и заменит changeTextBox1(result.Text); на MessageBox.Show(result.Text.ToString());, это сработает.

Как я могу обновить текстовое поле вместо использования MessageBox?

ответ

2

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

+0

Как бы я использовал вызов для этого? я посмотрел на несколько из вопросов SO, но я не вижу, что я должен делать? – legohead

+0

Вам необходимо отправить сообщение окна в поток пользовательского интерфейса или иным образом синхронизировать выполнение, например. используя очередь, которую вы добавляете в поток обратного вызова, и вы удаляете из потока пользовательского интерфейса. –

Смежные вопросы