В настоящее время у меня есть рабочая программа, которая отображает предварительный просмотр с моей веб-камеры и использует интерфейс 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?
Как бы я использовал вызов для этого? я посмотрел на несколько из вопросов SO, но я не вижу, что я должен делать? – legohead
Вам необходимо отправить сообщение окна в поток пользовательского интерфейса или иным образом синхронизировать выполнение, например. используя очередь, которую вы добавляете в поток обратного вызова, и вы удаляете из потока пользовательского интерфейса. –